2016-07-29 7 views
2

1回のリクエストで同じプライマリキー値を持つエンティティを削除して追加する必要があります。エンティティフレームワーク:単一の要求で同じキーを持つエンティティを削除して追加する

以下はエラーを示すサンプルコードです:PRIMARY KEY制約 'PK_Table'の違反。オブジェクト 'dbo.Table'に重複キーを挿入できません。

context.Set<Entity>().Attach(existingEntityObj); 
Entry(existingEntityObj).State = EntityState.Deleted; 

context.Set<Entity>().Add(newEntityObj); 
context.Entry<Entity>(newEntityObj).State = EntityState.Added; 

context.SaveChanges(); 

オブジェクト(existingEntityObjとnewEntityObj)の両方が主キープロパティに同じ値を有すると仮定する。

ありがとうございます!

+1

主キー制約を削除し、エンティティを削除し、エンティティを追加し、主キー制約を元に戻す必要があります。ただし、FKがそれを参照するときに主キー制約を削除することはできません。あなたがしていることは悪い考えのように聞こえる。新しいオブジェクトのデータで既存のオブジェクトを変更するだけではできませんか? – Pakman

答えて

2

この作業を行うには、2つのSaveChanges()呼び出しを行う必要があります。ここで問題となるのは、最初にレコードを削除してから新しいレコードを追加するように見えている間に、フレームワークが実際に挿入を最初に実行しているということです。

理由は、Entity Frameworkが操作の発生順序を細かく制御できないためです。そのため、2つのTransactionScopeで2つをラップすることが最善の方法です。発生します。

あなたがここで詳細を読むことができます:あなたは同じ主キーの値を保持したい場合はソリューションは、更新新しいエンティティの値を持つ古いエンティティにあるようhttps://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

+0

トランザクションの例と同様の回答https://stackoverflow.com/questions/2600688/clear-anentitycollection-and-then-add-to-it-within-the-same-transaction-doesnt/2601143#2601143 –

2

単一の更新ステートメントは、あなたのために働くことができます。主キーはエンティティを識別するため、古いものを削除してそれに代えて新しいものを追加すると、更新と同じ効果があります。

私が間違っていると感じたら、私にぴったりの例を与えてください。

関連する問題