2011-07-12 6 views
3

ナビゲーションプロパティは、エラーで失敗する私の深いクローンを引き起こしている:エンティティを詳細に複製し、ナビゲーションプロパティによるエラーを回避するにはどうすればよいですか?私のエンティティの

"An object with the same key already exists in the ObjectStateManager"

背景:

ユーザーは、親レコードとそのすべての関連した子レコードのクローンを作成できるようにしたいです。私はそのソリューションと(diamandievから)別の作業浅いクローン技術hereを見つけ

_context.Detach(currentParentEntity); 
_context.AddToParentEntities(currentParentEntity); 
_context.SaveChanges(); 

:私はこの単純な技術を用いて、(エラーなしで)単独の親エンティティのクローンを作成することができますよ。

実際に必要なのは、here,hereおよびhereというシリアル化クローニング手法を実装しようとした深いコピーです。

このコードは、(ナビゲーションプロパティで参照される)子エンティティなしでcurrentParentEntityを複製する場合にのみ機能します。子のentitesが存在する場合、私は "同じキーを持つオブジェクトが既に存在する"というエラーを受け取ります。どうして? 親エンティティとそれに関連付けられた子エンティティの両方を深くクローンすると、エラーなしで複製されたレコードを保存できますか?

ありがとうございます。

編集:完全に受け入れられた回答については、Ladislav Mrnkaの回答とコメントをお読みください。

答えて

2

シリアライゼーションを実際に使用した場合、親エンティティと子エンティティの両方をクローンしました。これは問題ではありません。あなたの問題は、(子供ではなく)分離している単一のエンティティだけが削除されるため、Detachと呼ばれています。したがって、エラーは、すでにコンテキストによって追跡されている同じキーを持つ子を追加することによって発生します。

+0

これは意味があります。今では、子エンティティを切り離して、エラーなしで複製されたレコードを保存する方法についていくつかの助けをすることができました。良いコードサンプルがどこにあるかについての提案はありますか?私が見つけたサンプルは不完全です。 – DeveloperDan

+0

このようなサンプルはおそらくありません。最も簡単な方法は、クローンを作成し、それをコンテキストの新しいインスタンスに追加することです。 –

+1

新しいコンテキストを使用すると機能します。ありがとう!新しいコンテキストでSaveChangesを呼び出した後、元のコンテキストに再クエリしてクローンレコードを表示します。新しいコンテキストでDisposeを呼び出す必要がありました。または、新しいレコードを変更する際にエラーが発生しました。「2つのオブジェクトの関係は、異なるObjectContextオブジェクトに関連付けられているため定義できません。 usingステートメントで宣言したにもかかわらず、新しいコンテキストでContext.Disposeが必要でした。問題が解決しました。 StackOverflowが揺れる! – DeveloperDan

関連する問題