2010-12-10 40 views
14

我當前的項目需要與外部系統進行日常同步。同步基於複雜的導入文件結構,可以使用廣泛的業務邏輯進行分析和處理。由於業務邏輯的原因,我們決定使用.NET代碼並重用現有的BL組件,而不是在存儲過程或集成服務中寫入相同的邏輯。在Entity Framework 4.0中批量處理數據庫命令

BL層位於EF 4.0數據訪問層之上。當前實現處理導入批處理,將所有更改填入ObjectContext並在事務中執行SaveChanges。當我檢查SQL分析器時,我發現EF執行每個實體更改爲單個SQL命令(具有自己的往返數據庫)。此外,它看起來像這些命令完全按順序執行。所以我有多達100.000往返數據庫的初始導入和10.000 - 50.000往返數據庫的日常同步。

是否可以通過EF本身或某些提供商/擴展以某種方式批量插入/更新/刪除命令?

回答

8

不,它不能完成(是的 - 我也哭了)。

EF不支持批量操作,LINQ-SQL有(有)同樣的問題。

你有幾種選擇:

  1. 存儲過程
  2. 經典ADO.NET或EntitySQL
  3. 觸發器

我已經在選項1和3過去。

所有這三種方法的問題都是你失去了EF抽象,內部圖(樂觀併發)以及你帶回了原生SQL的世界。

+0

因此,我會接受我目前的解決方案,因爲重寫解決方案不是一種選擇。 :( – 2010-12-10 11:58:40

+2

是的,EF並不是爲批處理工作而設計的,特別是類似「導入批處理」的東西 - 是一個數據庫問題,而不是ORM問題,我甚至不會使用EF來處理這個問題,我之前的項目也需要db與我們的和外部的同步,我們使用windows服務(在wcf之前)天) – RPM1984 2010-12-10 12:15:31

3

要知道這個項目的:magiq.codeplex.com

它帶來了批量操作,以LINQ到SQL和我們在的EntityFramework支持現在的工作。

乾杯

+0

這是一個好消息,謝謝。 – 2011-04-29 16:12:56

+0

這個項目的最後一次提交是在2012年10月1日:( – 2014-10-03 19:30:53

0

只需與您共享一個GitHub項目就可以了,截至目前,它支持透明地使用SqlBulkCopy批量插入/更新/刪除Sql服務器。 https://github.com/MHanafy/EntityExtensions 還有其他的好東西,並希望,它將被延伸到更多的軌道上。 使用它很簡單

var insertsAndupdates = new List<object>(); 
var deletes = new List<object>(); 
context.BulkUpdate(insertsAndupdates, deletes); 

希望它有幫助!