我試圖使用this answer中的方法複製實體框架中的對象,但是當我調用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消息=多重約束違反未處理。 角色'MyObject_Property1_Target'的關係 'DataModels.MyObject_Property1'具有 重複1或0..1。源=的EntityFramework堆棧跟蹤: 在System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal(的EntityReference refToPrincipal,IEntityWrapper wrappedPrincipal) 在System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(的EntityReference relatedEnd,的EntityKey FOREIGNKEY布爾setIsLoaded,布爾 replaceExistingRef) 在System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(布爾 replaceAddedRefs,EntitySetBase restrictTo) 在
注意Property1
是一個外鍵完整的對象BA ck到MyObject
。從我所知道的情況來看,多重性錯誤來自事實上,根據EF,現有實體和我的克隆之間的對象是「相同的」(我檢查過它們不是相同的)。
從上面的答案看來,我想在使用AsNoTracking
時EF會處理這個並生成一個新版本的Property1
實體來保存到數據庫。這不是這種情況嗎?如果不是,用所有引用屬性克隆整個實體的最佳方法是什麼?
我不知道它是否正確,但它解決了我的問題,所以謝謝。 –