簡體   English   中英

嘗試克隆Entity Framework對象時違反了多重性約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM