Сохраняющиеся отключенные объекты POCO - PullRequest
1 голос
/ 29 ноября 2011

Я работаю с отключенными объектами 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 не может отслеживать несколько объектов с одним и тем же ключом».

Кто-нибудь знает, если я делаючто-то не так?

Я просто хочу сохранить объекты и связанные с ними объекты.

Спасибо за помощь.

Луис Густаво


Я 'мы пытались отделить сущность, но в этом случаеe Я теряю все связанные объекты, и мне нужны эти связанные объекты, чтобы я мог добавлять / удалять.

После этого я хотел сохранить их обратно в базу данных.

Я делаю глупостьархитектура ??

Луис Густаво

1 Ответ

0 голосов
/ 29 ноября 2011

Проблема здесь заключается в том, что объект 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.

...