[英]Multiplicity constraint violated when trying to clone Entity Framework object
我正在嘗試使用此答案中的方法在Entity Framework中復制對象,但是當我調用Add(clone)
我收到一個InvalidOperationException,說已違反多重性約束。 我的代碼看起來像這樣
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。 Source = EntityFramework StackTrace:位於System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal(EntityReference refToPrincipal,IEntityWrapper包裝的Principal)位於System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd,EntityKey外鍵,布爾setIsLoaded, System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys處的布爾值ReplaceExistingRef)
請注意, Property1
是一個完整的對象, MyObject
鍵返回MyObject
。 據我所知,多重錯誤來自於這樣一個事實,即根據EF,現有實體和我的克隆之間的Property1
對象“相同”(我檢查它們的引用不相等)。
從以上答案的外觀來看,我認為當使用AsNoTracking
EF時,它將處理此問題並生成Property1
實體的新版本以保存到數據庫。 不是嗎? 如果沒有,那么克隆具有所有引用屬性的整個實體的最佳方法是什么?
我通過將所有引用屬性的主鍵設置為0來解決此問題。所以我的代碼現在看起來像
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();
我不確定這是否是正確的方法-當然感覺不正確-但我無法找到其他可行的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.