Сохраняющиеся отключенные объекты POCO
Я работаю с отключенными объектами POCO.
Когда я сохраняю один объект, он работает отлично!
Проблема начинается, когда я хочу сохранить связанные объекты.
Например:
Извлечение объекта из слоя данных:
using (MyContext ctx = new MyContext ())
{
return ctx.Users.First();
}
Этот объект возвращается на бизнес-уровень и там я добавляю несколько дочерних записей, см. Ниже (просто для иллюстрации):
objectUser.Permissions.Add(new Permission());
objectUser.Permissions.Add(new Permission());
Разрешения - это переход к разрешениям пользователя.
И затем я хочу сохранить этот объект User обратно в базу данных, затем я делаю:
using (MyContext ctx = new MyContext ())
{
ctx.Users.Attach(objectUser);
ctx.ObjectStateManager.ChangeObjectState(objectUser, System.Data.EntityState.Modified);
ctx.SaveChanges();
}
Но в первой строке при использовании я получаю ошибку: "Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом".
Кто-нибудь знает, если я делаю что-то не так?
Я просто хочу сохранить объекты и связанные с ними объекты.
Спасибо за помощь.
Луис Густаво
Я пытался отделить сущность, но в этом случае я теряю все связанные объекты, и мне нужны эти связанные объекты, чтобы я мог добавить / удалить.
После этого я хотел сохранить их обратно в базу данных.
Я делаю глупую архитектуру??
Луис Густаво
1 ответ
Проблема здесь заключается в том, что objectUser
Объект по-прежнему привязан к контексту, используемому для его извлечения из базы данных. Если вам нужен этот рабочий процесс, в котором определены два разных контекста, вы должны отсоединить objectUser
из начального контекста. Один из способов сделать это - отключить отслеживание объектов на objectUser
контекстный объект. В качестве альтернативы вы можете вручную отсоединить объект от контекста.
using (MyContext ctx = new MyContext ())
{
//EF 4.1 - ctx.Configuration.AutoDetectChangesEnabled = false;
ctx.Users.MergeOption = MergeOption.NoTracking;
return ctx.Users.First();
}
Блог: http://blogs.msdn.com/b/dsimmons/archive/2010/01/12/ef-merge-options-and-compiled-queries.aspx
Часть 1 посвящена свойству MergeOption.