Jam*_*mes 4 c# sql-server entity-framework ef-code-first
我需要使用EF Code First插入大约2500行.
我的原始代码看起来像这样:
foreach(var item in listOfItemsToBeAdded)
{
//biz logic
context.MyStuff.Add(i);
}
Run Code Online (Sandbox Code Playgroud)
这花了很长时间.每次DBSet.Add()通话大约需要2.2秒,相当于大约90分钟.
我重构了这个代码:
var tempItemList = new List<MyStuff>();
foreach(var item in listOfItemsToBeAdded)
{
//biz logic
tempItemList.Add(item)
}
context.MyStuff.ToList().AddRange(tempItemList);
Run Code Online (Sandbox Code Playgroud)
这只需要大约4秒钟才能运行.但是,.ToList()查询当前表中的所有项目,这是非常必要的,从长远来看可能是危险的,甚至更耗时.一个解决方法是做一些事情,context.MyStuff.Where(x=>x.ID = *empty guid*).AddRange(tempItemList)因为我知道永远不会有任何返回.
但我很好奇是否有其他人知道使用EF Code First进行批量插入的有效方法?
STW*_*STW 13
验证通常是EF的一个非常昂贵的部分,通过以下方式禁用它,我获得了很大的性能提升:
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;
Run Code Online (Sandbox Code Playgroud)
我相信我发现在一个类似的问题中 - 也许就是这个答案
关于这个问题的另一个答案正确地指出,如果你真的需要批量插入性能,你应该考虑使用System.Data.SqlClient.SqlBulkCopy.EF和ADO.NET之间针对此问题的选择实际上围绕着您的优先事项.
| 归档时间: |
|
| 查看次数: |
12876 次 |
| 最近记录: |