2017-05-15 34 views
1

我正在使用實體框架代碼優先插入相對較大數量的記錄(250K記錄,僅2列)的項目。使用實體框架寫入大量記錄需要太多時間

但是,將所有記錄寫入數據庫需要太多時間(2〜3小時)!

這是因爲實體框架很慢,大數量或記錄還是什麼?

P.S.

代碼片段:

foreach (var t in myCollection) 
{  
    Db.Words.Add(t); 
    Db.SaveChanges(); 
} 

回答

5

實體框架是不適合用於批量操作保存一次。即使在最後(或每100個記錄或某物)執行Context.SaveChanges()時也是如此。

using (var context = new MyContext()) 
{ 
    // This might speed up things a little aswell 
    context.Configuration.AutoDetectChangesEnabled = false; 

    // As might this (if applicable for your situation) 
    context.Configuration.ValidateOnSaveEnabled = false; 
} 

爲了獲得最佳性能,您可能需要使用一些接近到數據庫就像一個存儲過程,或者如果它必須在代碼中,直接使用ADO.NET。

SqlBulkCopy可能正是你想要的。

+0

提及'SqlBulkCopy'。我還想指出Sql Server [BULK INSERT](https://docs.microsoft.com/zh-cn/sql/t-sql/statements/bulk-insert-transact-sql)命令的存在。 – EJoshuaS

2

添加他們都在一個循環,然後在年底

foreach (var t in myCollection) 
    {  
     Db.Words.Add(t); 
    } 

    Db.SaveChanges(); 
+0

爲了澄清,最好存儲您的更改,然後寫入一次,而不是一遍又一次發送寫入請求。 – CDove

+4

此外OP還有25萬條記錄可以插入。在這麼多記錄上做一個'SaveChanges'會導致其他問題。可能更適合以100/500組的方式進行批處理或使用適當的批量插入庫。 – DavidG

+1

是的,現在有一條記錄有問題(字符串太長,不可空列是'null',無效關係),所有250K條記錄都失敗。這不是解決方案,請參閱重複。 – CodeCaster

相關問題