2016-04-22 14 views
2

this answerのメソッドを使用してEntity Frameworkでオブジェクトを複製しようとしていますが、Add(clone)を呼び出すと、多重度制約が違反しているというInvalidOperationExceptionが発生します。私のコードは、このEntity Frameworkオブジェクトのクローン作成時に多重度制約違反が発生しました

var dbSet = context.Set<MyObject>() 
var clone = dbSet.Include(e => e.Property1) 
       .Include(e => e.Property2) 
       .Include(e => e.Property3) 
       .AsNoTracking() 
       .First(e => e.Id == OriginalPrimaryKey) 
dbSet.Add(clone); // Throws InvalidOperationException 
context.SaveChanges(); 

のように見えるのスタックトレースは

のSystem.InvalidOperationExceptionのように見えます
HRESULT = -2146233079メッセージ=多重度制約に違反し、ユーザーコードで未処理でした。関係 'DataModels.MyObject_Property1'の ロール 'MyObject_Property1_Target'は、 の多重度1または0..1です。ソース= EntityFrameworkのStackTrace:System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal(実体参照 refToPrincipal、IEntityWrapper wrappedPrincipal)で System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipalで (実体参照 relatedEnd、のEntityKey FOREIGNKEYブールsetIsLoaded、ブール replaceExistingRef)System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(ブール replaceAddedRefs、EntitySetBase restrictTo) 注

ATで Property1は外部キーとの完全なオブジェクトであることバckからMyObjectに変更します。私が知ることから、多重度エラーは、既存のエンティティと私のクローンとの間のオブジェクトがEFによると "同じ"という事実から来ている(それらは参照が等しくない、私がチェックした)。

上記の回答から、私はAsNoTrackingを使用してEFがこれを処理し、Property1エンティティの新しいバージョンを生成してデータベースに保存すると考えました。これは当てはまりませんか?そうでない場合は、参照されているすべてのプロパティでエンティティ全体をクローンする最良の方法は何ですか?

答えて

3

私は私のコードは今

var dbSet = context.Set<MyObject>(); 
var clone = dbSet.Include(e => e.Property1) 
       .Include(e => e.Property2) 
       .Include(e => e.Property3) 
       .AsNoTracking() 
       .First(e => e.Id == OriginalPrimaryKey); 
clone.Property1.Id = 0; 
clone.Property2.Id = 0; 
clone.Property3.Id = 0; 
dbSet.Add(clone); 
context.SaveChanges(); 

ように私はこれがこの-それを行うための正しい方法であれば、確かにdoesnのわからないに見えます0に参照されるすべてのプロパティの主キーを設定することで、これを固定しかし、私はそれ以外のものを見つけることができませんでした。

+0

それが正しいかどうかわかりませんが、私の問題はとても感謝しています。 –

関連する問題