Обновление одного и того же объекта после вызова SaveChanges вызывает исключение с EF5

У меня есть объект, который мне нужно сохранить дважды. В первый раз необходимо установить идентификатор. Этот идентификатор необходимо заполнить для расчета подписи, и эта подпись сохраняется обратно в сущность.

См. следующий код:

var newEntity = new MyEntity 
    { 
        \\ set values 
    };

using (var db = MyContainer.CreateContainer())
{
    db.MyEntity.Add(newEntity);
    // Call SaveChanges() to set the ID.
    db.SaveChanges();

    // I need to do some calculation on the entity
    myEntity.Signature = CalculateSignature(myEntity);
    db.SaveChanges(); // <--- This causes the exception
}

Этот фрагмент кода вызывает InvalidOperationException, а именно The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.

Я не понимаю, мне нельзя дважды сохранять один и тот же объект? Как мне добиться этого?


person Davio    schedule 05.10.2012    source источник
comment
откуда myEntity?   -  person paul    schedule 05.10.2012
comment
Вы должны повторно добавить его обратно в контекст БД, потому что db.MyEntity.newEntity не совпадает с this.myEntity.   -  person Bob.    schedule 05.10.2012
comment
@paul В этом примере, вероятно, опечатка.   -  person user247702    schedule 05.10.2012


Ответы (2)


Я предполагаю, что CalculateSignature тоже создает контекст. Взгляните на множественные контексты объектов Entity Framework

person user247702    schedule 05.10.2012
comment
Вы были правы, вычисление подписи также создает контекст. Это связано с тем, что объект сериализуется до выполнения вычисления. Эта сериализация также вызывается из другого места, когда необходимо передать данные, и в этот момент ей нужен контекст для загрузки свойств навигации. - person Davio; 05.10.2012

Обычно это происходит, когда вы не используете общий контекст между объектами.

Вы загружаете запись с контекстом, а затем передаете ее в репозиторий?

У вас есть репозиторий, который затем создает новый контекст для сохранения, а не использует родительский контекст?

Я бы порекомендовал изучить шаблон проектирования, такой как шаблон «Единица работы», в котором вы используете общий DbContext для всех запросов.

http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

person Doug    schedule 05.10.2012