2014-12-02 51 views
1

我在進程中插入/更新大量實體(〜5000),這需要花費大量時間(它在5分鐘的事務中超時)。如何訪問EntityManager中使用的DBContext?

我讀到默認情況下DBContext.AutoDetectChangesEnabled設置爲ON並導致這種行爲(http://www.exsertus.be/2014/10/ef-bulk-performance/)。

就我的理解,Devforce「種類」在每個EntityManager中封裝了一個DBContext。 Devforce使用它自己的實現,除非我定義了我所做的。我想知道如何訪問它以便能夠使用此屬性AutoDetectChangesEnabled「玩」。

或者是否有任何其他解決方案使用Devforce插入/更新/刪除大量實體?

問候

回答

0

既然已經定義了你自己的DbContext你可以用Configuration.AutoDetectChangesEnabled = false;

改變這個屬性在構造函數中的DbContext設置但是,我不知道這種改變將有多少幫助。如果你的應用程序是多層的,並且你試圖通過電線保存約5000個實體,這總是會很慢,並且你還會遇到通信超時。一般來說,如果您需要執行任何批量操作,DevForce不是最佳方法。

+0

嗨kim。考慮到所有的應用程序/模型是基於devforce的,最好的方法是什麼?另外我注意到,當我調用SavesChanges()時,我可以等待超過1分鐘才能看到發送給SQL服務器的第一個SQL順序,爲什麼生成SQL這麼長時間。我不知道是誰生成了它,Devforce或EF ... – kdev 2014-12-16 08:54:35

+0

EF生成SQL,但是可能會有更多的事情發生,而不僅僅是SQL生成使其變得緩慢。雖然我沒有任何經驗,但如果批量操作不是主應用程序的一部分,我會考慮使用EF實用程序。如果您希望IdeaBlade的某人進一步瞭解這一點,請通過網絡支持表單打開技術支持案例。 – 2014-12-16 16:37:26

1

我有這個EF工具「https://www.nuget.org/packages/EFUtilities」的工作,我得到了很大的性能增強與大型插入,因爲它使用批量複製,而不是每個實體的正常插入的。

您可以查看Github here的文檔。

我用17000個實體插入事務處理它,並在幾秒內完成它。 選中此項可以更好地瞭解和比較EF。 http://blog.credera.com/technology-insights/microsoft-solutions/entity-framework-batch-operations-using-ef-utilities/

使用工具插入實體列表的樣本是這樣的:

using (var db = new YourDbContext()) 
{ 
    EFBatchOperation.For(db, db.BlogPosts).InsertAll(list); 
} 

希望這有助於。

+0

不幸的是我不能使用這個,因爲我需要主鍵修復程序 – kdev 2014-12-08 08:14:24

+0

你的意思是你生成你的ID?如果是這種情況,那很好,因爲該工具可以在你的實體上工作,但不是將它們附加到上下文並逐一保存,這個工具將一舉推動它們。圖書館絕對值得一試。 – 2014-12-08 08:18:18

+0

@kdev我想你是說你實際上插入到兩個表中,需要將子行指向他們的父母?如果您使用父數據庫生成的ID,這是一個難題。 (在這種情況下,我總是改用guid或類似的方式)。 – 2014-12-08 11:55:58