2011-05-05 37 views
4

我使用EF 4,POCO。其任務如下:擁有一組需要從數據庫中獲取的DomainObject類型的數據,並在斷開模式下進行更新(添加,更新,刪除操作)。我怎樣才能將更新的集合稍後推回數據庫?讓我們假設自從我們加載數據以來沒有對錶進行並行更改。我知道context.SaveChanges()進行更新,但問題是如何將所有更改從類別列表中返回到DbSet,或者可能有辦法直接在斷開連接模式下使用DbSet?謝謝!EF 4:如何更新斷開的一組數據?

回答

7

自跟蹤實體EDMX + ObjectContext的API的功能,所以如果你有你的映射/代碼依賴的DbContext API(你提到的DbSet)你不能使用它們。自我跟蹤實體是變更集模式的實現(如舊數據集)。對因此一些參考:

如果不使用自跟蹤實體的答案很簡單 - 你必須說你做了什麼EF變化。一旦使用分離的實體,您必須將實體附加到新的上下文中,並手動說出您做了什麼=插入,更新,刪除以及如何更改關係。此過程中的關鍵組件是DbContext API(context.ChangeTracker)中的ObjectContext API(context.ObjectStateManager)或DbChangeTracker中的ObjectStateManager。處理通常使用另一個進程的許多人的關係時,這非常困難:我們再次加載實體圖並將從分離的實體圖的更改合併到附加的實體圖。一些參考:

要知道,整個過程中你可以根據你想要做更新的數量是相當緩慢的。原因是EF doesn't support command batching所以每次插入,更新,刪除都是在單獨往返數據庫中執行的。如果更新100.000個複雜對象,則預計執行SaveChanges需要幾分鐘的時間。

編輯:

在某些地方,你有實體只有工作,沒有關係,你可以使用一個技巧來傳輸關於「變化」的信息非常特殊的情況:

public void ProcessChanges(IEnumerable<DomainObject> entities) 
{ 
    foreach(var entity in entities) 
    { 
     if (entity.Id == 0) 
     { 
      // New entity 
     } 
     else if (entity.Id > 0) 
     { 
      // Modified entity (you cannot say if entity war really modified, 
      // you must update it always). 
     } 
     else 
     { 
      // Use negative Id (origId * -1) to mark entity as deleted 
      // reverse Id and delete entity 
     } 
    } 
} 

這僅適用於與平面物體簡單的關鍵。

+0

感謝您的文章,您似乎在該領域擁有豐富的經驗。對,我使用POCO,所以STE不能幫助我。讓我澄清一下,我怎麼知道插入或更新了DomainObject列表的內容?看起來我需要有2個單獨的列表來更新和添加記錄,或者擴展我的DomainObject以存儲操作信息,對吧? – YMC 2011-05-05 22:04:06

+0

是的,您需要將該信息作爲第二個數據結構或域對象(實際上意味着實現您自己的STE)傳遞。這顯然是你通常不想做的事情,這也是我們經常使用我描述的方法的原因:從DB加載實體併合並更改。但我並不是說它是唯一可以做到這一點的非常簡單的場景,您可以使用一些技巧來傳輸有關修改的信息 - 我會將示例添加到我的答案中。 – 2011-05-05 22:08:15

+0

讓我澄清我的任務。也許你可以提出解決方案:1)我不需要在輪胎之間發送數據。2)它是一個簡單的域實體,沒有圖。3)通過斷開的數據集,我的意思是我的域對象的普通列表。可能我可以直接使用DbSet?目的是請求Db一次,然後在內存中執行一些複雜的處理(不處理數據庫),請求,更新和向內存中的結構添加數據,這將花費更多時間直接在數據庫上執行操作。最後將更改推送到數據庫,或者將它們覆蓋到數據庫,替換整個數據集(數據庫中的表格)。 – YMC 2011-05-05 22:19:58

-1
+0

感謝您的提示。我不知道這個功能。讓我檢查一下。 – YMC 2011-05-05 01:13:45

+0

您還可以在本書中找到一個很好的自我實體實例:實體框架食譜:問題解決方案 如果您在谷歌上查找它,您將有預覽,並且您可能能夠查看正確的示例 – 2011-05-05 01:15:59

+0

查找「實體框架食譜:問題解決方案方法」中的第9-5,9-6,9-7和9-9部分 – 2011-05-05 01:24:03