2014-03-31 95 views
3

我正在將Linq用於一般CRUD操作的實體。最近,我有一個場景,我必須在數據庫中複製整個記錄(在所有相關表中使用不同的主鍵)。我的數據庫結構非常簡單。我有一個主表(可以說A)和其他表(可以說B,C,D)。主表保存表B,C,D的主鍵作爲外鍵。Linq複製/複製整個記錄

我從數據庫獲取記錄,我必須複製。然後我

1)更改使用context.objectStateManager.ChangeObjectState(AObj其目的狀態改變爲 「增加」,EntityState.Added)

2)添加在上下文中使用context.AddToA(AObj)對象

3)然後我做save​​Changes()

一切正常工作表A和適當的新對象插入。

如果我上表相同的步驟B,C,d我到 「增加」 使用context.objectStateManager.ChangeObjectState(AObj.B異常

1)改變其狀態的對象, EntityState.Added)//在這裏,我訪問子表乙

2)添加在上下文中使用context.AddToA(AObj)對象

3)然後我做的SaveChanges()

objectContext可能處於不一致的狀態。參考 完整性約束voilation發生。 定義重建約束的屬性值在主體 和關係中的相關對象之間不一致。

+1

的討論,你可能想改變你的儲蓄因此要創建無按鍵konstrains順序 –

+0

嗯,我也試圖在表中手動插入數據(相同的,因爲我是在代碼中執行),並且所有內容都會插入任何錯誤。 linq有些問題。 –

+1

您不需要添加項目,它們已經在上下文中。你只需要改變他們的狀態。 –

回答

0

閱讀使用AsNoTracking()對象圖,那麼它只是一個將它添加和保存,不愁訂單或國家的問題,我用這個來實現在最近的項目另存爲功能:

 var myGraph = tableA.Where(c => c.Id == id) 
      .Include(c => c.childA) 
      .Include(c => c.childB) 
      .Include(c => c.childC) 
      .AsNoTracking() 
      .FirstOrDefault(); 

     if (myGraph != null) 
     { 
      myGraph.CopiedFromId = id; 

      myGraph = Context.Set<TableA>().Add(myGraph); 

      Context.SaveChanges(); 
     } 

這裏是AsNoTracking()