2016-04-22 91 views
2

我試圖使用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實體來保存到數據庫。這不是這種情況嗎?如果不是,用所有引用屬性克隆整個實體的最佳方法是什麼?

回答

3

我解決了這個問題的所有引用屬性的主鍵設置爲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(); 

我不知道這是否是做正確的方式這個,它肯定沒有按感覺不錯 - 但我一直無法找到其他可行的東西。

+0

我不知道它是否正確,但它解決了我的問題,所以謝謝。 –

相關問題