Актуализирането на същия обект след извикване на SaveChanges причинява изключение с EF5

Имам обект, който трябва да запазя два пъти. Първият път е да зададете ID. Този идентификатор трябва да бъде попълнен, за да се изчисли подпис и този подпис се съхранява обратно в обекта.

Вижте следния код:

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, защото 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