Обновление записи базы данных с использованием Entity Framework (отложенная загрузка и виртуальные свойства)

я борюсь собновление существующий лекторданные в базе данных.

У каждого лектора естьНазвание,Ученая степень а такжеКурсы которые преподаются им / ею (Курсы == Уроки).

На самом деле есть больше свойств вclass Lecturer но они не актуальны. Для простоты предположим, чтоПОКО класс определяется следующим образом:

// POCO class (Entity Framework Reverse Engineering Code First)
public class Lecturer
{
    public Lecturer()
    {
        this.Courses = new List();
    }

    public int Id_Lecturer { get; set; } // Primary Key
    public string Name { get; set; }
    public int? Academic_Degree_Id { get; set; }
    public virtual AcademicDegree AcademicDegree { get; set; }
    public virtual ICollection Courses { get; set; }
}

ВУровень доступа к данным У меня есть методvoid UpdateLecturer(Lecturer lecturer) который должен обновить лектора которогоId_Lecturer равноlecturer.Id_Lecturer (с помощью ,lecturer.Namelecturer.AcademicDegree а такжеlecturer.Courses).

Это'очень удобный метод, потому что вViewModel я могу позвонить_dataAccess.UpdateLecturer(SelectedLecturer) (гдеSelectedLecturer связан вXAML;SelectedLecturer свойства могут быть установлены пользователем вTextBoxэс иCheckbox).

К сожалению, этот метод:

    public void UpdateLecturer(Lecturer lecturer)
    {
        using(var db = new AcademicTimetableDbContext())
        {
            // Find lecturer with Primary Key set to 'lecturer.Id_Lecturer':
            var lect = db.Lecturers.Find(lecturer.Id_Lecturer);

            // If not found:
            if (lect == null)
                return;

            // Copy all possible properties:
            db.Entry(lect).CurrentValues.SetValues(lecturer);
            // Everything was copied except 'Courses'. Why?!

            // I tried to add this, but it doesn't help:
            // var stateMgr = (db as IObjectContextAdapter).ObjectContext.ObjectStateManager;
            // var stateEntry = stateMgr.GetObjectStateEntry(lect);
            // stateEntry.SetModified();

            db.SaveChanges();
        }
    }

обновляет все (то есть,Id_LecturerNameAcademic_Degree_Id а также )AcademicDegreeКроме Courses которые не изменились после.db.SaveChanges()

Зачем? Как я могу это исправить?

Похожие проблемы:

обновление-ан-объект-в-сущность-рамкикак-д-могу-я присоедините-а-сущность-рамку объектно-что-разве-из-баз данныхиспользуя-DbContext-в-эф-функция-CTP5-часть-4-надстройку присоединять-и-сущность-states.aspxорганизация-каркасное обновление-с-связанное ничтожествосущность-рамки-кода первого-не-открепление-метод-на-DbContext

-- Редактировать --

Я тоже так пробовал (идея пришла отэта почта):

public void UpdateLecturer(Lecturer lecturer)
{
    using (var db = new AcademicTimetableDbContext())
    {
        if (lecturer == null)
            return;

        DbEntityEntry entry = db.Entry(lecturer);

        if (entry.State == EntityState.Detached)
        {
            Lecturer attachedEntity = db.Set().Find(lecturer.Id_Lecturer);

            if (attachedEntity == null)
                entry.State = EntityState.Modified;
            else
                db.Entry(attachedEntity).CurrentValues.SetValues(lecturer);
        }

        db.SaveChanges();
    }
}

но до сих порКурсы дон»перезаписать старые значения.

- Правка 2 -

В ответ на вопрос @Slauma I 'опишу как я загруженSelectedLecturer (который передаетсяUpdateLecturer(Lecturer lecturer) метод в качестве аргумента) .I '

м реализацииMVVM концепция, поэтому у меня естьПосмотреть проект в моемРешение сDataContext установлен вLecturerListViewModel, ВПосмотреть естьDataGrid со списком всех лекторов, извлеченных из базы данных.DataGrid привязан таким образом:


    
        
        
        
            
                
                    
                        
                        
                    
                
            
        
    

Lecturers выбираются из базы данных вLecturerListViewModel конструктор таким образом:

///
/// Code within LecturerListViewModel class:
///

// All lecturers from database.
public ObservableCollection Lecturers

// Constructor
public LecturerListViewModel()
{
    // Call to Data Access Layer:
    Lecturers = new ObservableCollection(_dataAccess.GetAllLecturers());

    // Some other stuff here...
}

private Lecturer _selectedLecturer;

// Currently selected row with lecturer.
public Lecturer SelectedLecturer
{
    get { return _selectedLecturer; }
    set { SetProperty(out _selectedLecturer, value, x => x.SelectedLecturer); }
}

///
/// Data Access Layer (within DataAccess class):
/// 

public IEnumerable GetAllLecturers()
{
    using (var dbb = new AcademicTimetableDbContext())
    {
        var query = from b 
                    in dbb.Lecturers.Include(l => l.AcademicDegree).Include(l => l.Timetables).Include(l => l.Courses)
                    select b;
        return query.ToList();
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос