私は何を逃していますか?(同じIDを持つエンティティがこのEntitySetにすでに存在します。)
-
27-09-2019 - |
質問
エンティティフレームワークシナリオでDTOとコンバーターを使用しています。エンティティを更新したい。だから私はこの声明を置きます:
databasecontext.Tablename(s).Attach(entityobj);
ここに到達するたびに、プログラムは次のエラーで終了します。
An entity with the same identity already exists in this EntitySet
。
databasecontext.Tablename(s).Detach(entityobj);
と言うことで、これを回避できると感じました
もう一度アタッチを呼び出す前に。ただし、プログラムはAttachステートメントで失敗します。
何が足りないのですか?DBコンテキストのどのメソッドがドメインサービスのUpdateを呼び出しますか?
解決
変更を加えている間、コンテキストを開いたままにしているようです。
その場合、オブジェクトをコンテキストに再アタッチする必要はありません。
コンテキストを開く場合は、コンテキストからオブジェクトを取得してからコンテキストを閉じ、オブジェクトにいくつかの変更を加えてから、新しいコンテキストを開きます。この場合、オブジェクトをコンテキストにアタッチする必要があります。
他のヒント
質問は明確ではありません。データベースコンテキストの存続期間と、エンティティをコンテキストにロードした時期については言及していません。
しかし、あなたの質問に基づいて、エンティティをロードしてDTOとしてどこかに渡したと思います。また、DTOが返されるときは、同じコンテキストを使用しています。DTOをエンティティに変換し、再度アタッチしようとしています=> BANG例外。同じエンティティを2回コンテキストに配置することはできません。代わりにObjectContext.ApplyCurrentValues(EF 4.0)またはApplyPropertyChanges(EF 1.0)を使用してみてください。