デタッチされたエンティティをアタッチできません: "同じキーを持つオブジェクトがすでに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での回答も大歓迎です。

受け入れられた回答

連絡先エンティティに、同じEntityKeyを持つ2つの子エンティティがありますか。たとえば、Contactエンティティから同じキーを持つ2つのAddressエンティティにアクセスすることは可能ですか?

MergeOptions.NoTrackingを指定した場合、コンテキストは同じキーを持つエンティティを含む独立したオブジェクトグラフを返します。ただし、同じオブジェクトグラフを添付すると、 System.InvalidOperationExceptionがスローされます。

コンテキストにアタッチしているオブジェクトグラフ全体を見て、重複キーを持つオブジェクトがあるかどうかを確認することをお勧めします。


人気のある回答

答えは(私がそれを知らなかったので、これが問題だとは言っていなかったが)、追跡対象のエンティティにナビゲーションプロパティを設定すると、新しいエンティティが自動的に追加されるということです。

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

Dim state = a.EntityState '= Added

私はエンティティがどのように追跡されるのか疑問に思い続けたことを私は知らなかったので。私は全体のquesionを削除するでしょう、しかし私がここにそれを残すであろう役に立つかもしれない他の答えの努力があるので、あなたがそれが閉じられるべきであると思うならば閉じるために投票してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ