Обновление записи базы данных с использованием 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.Name
lecturer.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_Lecturer
Name
Academic_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();
}
}