2017-02-20 87 views
5

對於批量插入/更新/刪除操作,實體框架可能非常慢。即使通常建議的調整關閉AutoDetectChanges和/或ValidateOnSaveEnabled並不總是有幫助。Z.EntityFramework.Extensions是否有非商業的替代方案?

我碰到過NuGet上的Z.EntityFramework.Extensions,但它似乎是一個商業產品,它只會在一段時間內工作。

https://www.nuget.org/packages/Z.EntityFramework.Extensions/

到目前爲止,我真的只需要BulkInsert(),BulkUpdate()和BulkDelete()。

我的問題是:

有沒有可靠的非商業庫,但這幾乎相同Z.EntityFramework.Extensions?

感謝您的任何提示!

+0

對於批量更新和刪除您可以使用https:// github上的.com/loresoft/EntityFramework.Extended。對於批量插入 - 只需每100個左右的實體創建一個新的上下文。所以創建上下文,插入100,保存更改。然後創建一個新的,插入下一個100,保存更改等。將所有這些包含在事務範圍中。這不是真正的批量插入,但會比在同一個上下文實例中插入所有實體要快得多。 – Evk

+0

ORM通常不適用於批量操作,更不用說批量插入。這就像用鑷子運輸一整車的小石子。你不能用任何擴展名來覆蓋它。批量插入的最佳選擇是使用SqlBulkCopy來執行* real *,最小化日誌記錄的流式批量插入操作。如果你想執行批量更新,只需使用適當的UPDATE語句。如果您想從外部源* UPSERT *,將所有內容導入登臺表並使用MERGE更新目標表 –

+0

換句話說,您正在尋找可將不可靠,不安全,不可擴展的過程轉換爲可靠一。爲什麼不從一開始就使用可靠的可擴展流程? –

回答

2

免責聲明:我的Entity Framework Extensions

主人你是對的。這是一個商業產品。

每個月都有免費試用版,但您必須爲生產環境購買該產品。

容量插入

對於BulkInsert,也有一些免費的替代品,但要小心,他們並不支持所有遺產&協會,並且不再支持:

免責聲明:我的Entity Framework Plus

車主對於批量更新& &批量刪除,你可以使用這個庫:

// DELETE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Delete(); 

// UPDATE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Update(x => new User() { IsSoftDeleted = 1 }); 
+0

謝謝,喬納森。我會將此標記爲一個有效答案,因爲我認爲,作爲此類產品的所有者,您對其他競爭對手有很好的概述。真的很傷心,EF Plus中沒有插入,但我想這與商業產品有一定的區別。 – Michael

+1

不幸的是,我們試圖提供一些開源功能,但這種商業模式無法正常工作。所以是的,我們需要在兩個庫之間做一些區分。大部分時間開源/免費項目在一段時間後都不能得到支持,因爲隨着更多用戶使用它,成本/時間/複雜性不斷增加。舉例來說,去年,這個免費的圖書館比我們的其他圖書館結合了更多的時間來支持我們! –

+0

嗨邁克爾,只是想知道你在研究過程中是否遇到過SqlBulkTools? –