無法附加分離的實體:“ObjectStateManager中已存在具有相同密鑰的對象”

concurrency entity-framework objectstatemanager

我試圖將一個實體附加到ObjectContext。當我這樣做時,拋出以下InvalidOperationException:

An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

我檢查了對象狀態管理器,該項目不存在:

//Data context is actually the object context.
ObjectStateEntry contact;
while ( //Should only work once since it should be true if the item was attached
          !DataContext.ObjectStateManager.
          TryGetObjectStateEntry(Contact, out contact)
      )
      DataContext.Attach(Contact); //Here is the exception thrown.

或者看看這個抽象的例子並告訴我它是否有意義:

EntityState state = Contact.EntityState; //Detached

DataContext.Attach(Contact); //Throws the exception.
DataContext.AttachTo("Entities.Contacts", Contact); //Throws the Exception

var detached = DataContext.ObjectStateManager.
                   GetObjectStateEntries(EntityState.Detached);
//InvalidArgumentException - detached entities cannot be in the obj state mgr

VB中的答案也很受歡迎。

一般承認的答案

您的Contact實體是否有兩個具有相同EntityKey的子實體?例如,是否可以從Contact實體獲取具有相同密鑰的兩個Address實體?

如果指定MergeOptions.NoTracking ,則上下文將很樂意返回包含具有相同鍵的實體的分離對像圖。但是,當您附加相同的對像圖時,將拋出System.InvalidOperationException

我建議您查看附加到上下文的整個對像圖,並檢查是否存在包含重複鍵的對象。


熱門答案

答案是(我沒有提到這是問題,因為我不知道它是),如果你將導航屬性設置為被跟踪的實體,則會自動添加新實體:

Dim s = context.States.FirstOrDefault()
Dim a As New Address
a.State = s

Dim state = a.EntityState '= Added

因為我不知道我一直想知道實體是如何被跟踪的。我會刪除整個問題,但由於其他答案的努力可能會有所幫助,我會留在這裡,投票結束,如果你認為它應該被關閉。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因