我使用EF 4,POCO。其任務如下:擁有一組需要從數據庫中獲取的DomainObject類型的數據,並在斷開模式下進行更新(添加,更新,刪除操作)。我怎樣才能將更新的集合稍後推回數據庫?讓我們假設自從我們加載數據以來沒有對錶進行並行更改。我知道context.SaveChanges()進行更新,但問題是如何將所有更改從類別列表中返回到DbSet,或者可能有辦法直接在斷開連接模式下使用DbSet?謝謝!EF 4:如何更新斷開的一組數據?
回答
自跟蹤實體EDMX + ObjectContext的API的功能,所以如果你有你的映射/代碼依賴的DbContext API(你提到的DbSet
)你不能使用它們。自我跟蹤實體是變更集模式的實現(如舊數據集)。對因此一些參考:
如果不使用自跟蹤實體的答案很簡單 - 你必須說你做了什麼EF變化。一旦使用分離的實體,您必須將實體附加到新的上下文中,並手動說出您做了什麼=插入,更新,刪除以及如何更改關係。此過程中的關鍵組件是DbContext API(context.ChangeTracker
)中的ObjectContext API(context.ObjectStateManager
)或DbChangeTracker
中的ObjectStateManager
。處理通常使用另一個進程的許多人的關係時,這非常困難:我們再次加載實體圖並將從分離的實體圖的更改合併到附加的實體圖。一些參考:
- Update relationships when saving changes EF4 POCO objects
- EF4/POCO/Repository how to update relationships
要知道,整個過程中你可以根據你想要做更新的數量是相當緩慢的。原因是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
}
}
}
這僅適用於與平面物體簡單的關鍵。
你有沒有試過自我追蹤的實體?
http://msdn.microsoft.com/en-us/library/ff407090.aspx
http://blogs.msdn.com/b/adonet/archive/2010/06/02/working-with-sets-of-self-tracking-entities.aspx
感謝您的提示。我不知道這個功能。讓我檢查一下。 – YMC 2011-05-05 01:13:45
您還可以在本書中找到一個很好的自我實體實例:實體框架食譜:問題解決方案 如果您在谷歌上查找它,您將有預覽,並且您可能能夠查看正確的示例 – 2011-05-05 01:15:59
查找「實體框架食譜:問題解決方案方法」中的第9-5,9-6,9-7和9-9部分 – 2011-05-05 01:24:03
- 1. C#和EF 4 - 更新數據庫
- 2. EF 4刷新數據
- 3. 如何在MVC中使用LINQ EF更新數據庫4
- 4. EF:如果斷開連接,重新連接到數據庫
- 5. EF 4中的.edmx更改是否自動更新數據庫?
- 6. 如何判斷數據庫更新
- 7. 如何更新Solr 4中的數據?
- 8. 更新數據網格EF
- 9. EF不更新數據庫
- 10. MVC 4 EF數據庫優先模型構造函數更新
- 11. MVC 4,EF 5周的SaveChanges不更新數據庫
- 12. 如何更新一個實體沒有往返? (EF 4)
- 13. 如何在C#中創建一個不斷更新的數組?
- 14. EF 4不會更新db.SaveChanges數據庫記錄()
- 15. EF 4 - 追加到更新的字段
- 16. EF 4到EF 5數據庫驗證
- 17. Silverlight 4:如何使組合框更新打開的ItemsSource
- 18. EF4 - Sproc更新數據,但數據不會更新EF
- 19. 如何在EF更新一些領域
- 20. 什麼是更新EF 4中所有更改數據的最佳方法?
- 21. 如何用數據匹配另一個數組的數據來更新數組
- 22. ASP.NET MVC 4 EF更新操作
- 23. 如何更新數據庫中的某些列與EF
- 24. SaveChanges後,如何從數據庫更新緩存的EF?
- 25. 在socket.io斷開node.js中的更新數組
- 26. EF實體不會更新數據庫
- 27. MVC/EF部分更新相關數據
- 28. WebAPI EF更新30,000行數據很慢
- 29. | DataDirectory | for EF更新 - 數據庫
- 30. EF 5更新數據庫幫助
感謝您的文章,您似乎在該領域擁有豐富的經驗。對,我使用POCO,所以STE不能幫助我。讓我澄清一下,我怎麼知道插入或更新了DomainObject列表的內容?看起來我需要有2個單獨的列表來更新和添加記錄,或者擴展我的DomainObject以存儲操作信息,對吧? – YMC 2011-05-05 22:04:06
是的,您需要將該信息作爲第二個數據結構或域對象(實際上意味着實現您自己的STE)傳遞。這顯然是你通常不想做的事情,這也是我們經常使用我描述的方法的原因:從DB加載實體併合並更改。但我並不是說它是唯一可以做到這一點的非常簡單的場景,您可以使用一些技巧來傳輸有關修改的信息 - 我會將示例添加到我的答案中。 – 2011-05-05 22:08:15
讓我澄清我的任務。也許你可以提出解決方案:1)我不需要在輪胎之間發送數據。2)它是一個簡單的域實體,沒有圖。3)通過斷開的數據集,我的意思是我的域對象的普通列表。可能我可以直接使用DbSet?目的是請求Db一次,然後在內存中執行一些複雜的處理(不處理數據庫),請求,更新和向內存中的結構添加數據,這將花費更多時間直接在數據庫上執行操作。最後將更改推送到數據庫,或者將它們覆蓋到數據庫,替換整個數據集(數據庫中的表格)。 – YMC 2011-05-05 22:19:58