我正在使用實體框架代碼優先插入相對較大數量的記錄(250K記錄,僅2列)的項目。使用實體框架寫入大量記錄需要太多時間
但是,將所有記錄寫入數據庫需要太多時間(2〜3小時)!
這是因爲實體框架很慢,大數量或記錄還是什麼?
P.S.
代碼片段:
foreach (var t in myCollection)
{
Db.Words.Add(t);
Db.SaveChanges();
}
我正在使用實體框架代碼優先插入相對較大數量的記錄(250K記錄,僅2列)的項目。使用實體框架寫入大量記錄需要太多時間
但是,將所有記錄寫入數據庫需要太多時間(2〜3小時)!
這是因爲實體框架很慢,大數量或記錄還是什麼?
P.S.
代碼片段:
foreach (var t in myCollection)
{
Db.Words.Add(t);
Db.SaveChanges();
}
實體框架是不適合用於批量操作保存一次。即使在最後(或每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可能正是你想要的。
添加他們都在一個循環,然後在年底
foreach (var t in myCollection)
{
Db.Words.Add(t);
}
Db.SaveChanges();
爲了澄清,最好存儲您的更改,然後寫入一次,而不是一遍又一次發送寫入請求。 – CDove
此外OP還有25萬條記錄可以插入。在這麼多記錄上做一個'SaveChanges'會導致其他問題。可能更適合以100/500組的方式進行批處理或使用適當的批量插入庫。 – DavidG
是的,現在有一條記錄有問題(字符串太長,不可空列是'null',無效關係),所有250K條記錄都失敗。這不是解決方案,請參閱重複。 – CodeCaster
提及'SqlBulkCopy'。我還想指出Sql Server [BULK INSERT](https://docs.microsoft.com/zh-cn/sql/t-sql/statements/bulk-insert-transact-sql)命令的存在。 – EJoshuaS