Я создал класс POCO и его эквивалент в файле edmx (сущность Category с односторонним свойством навигации Parent)
public class Category {
public int ID {get;set;}
public string Name {get;set;}
public Category Parent {get;set;}
}
И у меня проблема с операциями CRUD, влияющими на свойство Parent:
Получить выглядит как:
public void CanRetrieve() {
var category = context.Categories.Where(x => x.ID == id).FirstOrDefault();
cotext.LoadProperty<Category> (category, c => c.Parent);
}
Муравей работает нормально (я получаю объект Category с заполненным родительским свойством)
Добавить выглядит так:
public void CanAdd() {
Category cat = new Category();
cat.Name = "cat 1";
cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12
context.Categories.Attach(cat);
context.SaveChanges();
}
также работает нормально (в БД появляется новая запись с полем Parent_ID, установленным в 12)
И обновление:
public void CanUpdate() {
Category cat = new Category();
cat.Name = "cat 1";
cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12
context.Categories.Attach(cat);
//XXX
context.SaveChanges()
}
делает что угодно. Если я заменим строку // XXX следующей строкой:
Context.ObjectStateManager.ChangeObjectState(cat, EntityState.Modified);
значение свойства Name обновляется из исходного объекта (я думаю, другие скалярные свойства также будут), но Parent игнорируется и поле Parent_ID в базе сохраняется.
У меня вопрос: как в этом сценарии я могу сказать контексту, что я хочу, чтобы значение свойства Parent также отражалось в базе данных, и можно ли это сделать, не передавая все значения свойства Parent (только идентификатор, как в сценарии добавления) )
С уважением,
Andrzej