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
エンティティの新しいバージョンを生成してデータベースに保存すると考えました。これは当てはまりませんか?そうでない場合は、参照されているすべてのプロパティでエンティティ全体をクローンする最良の方法は何ですか?
それが正しいかどうかわかりませんが、私の問題はとても感謝しています。 –