我需要使用 EF Code First 插入大约 2500 行。
我原来的代码看起来像这样:
foreach(var item in listOfItemsToBeAdded)
{
//biz logic
context.MyStuff.Add(i);
}
这花了很长时间。每个时间约为 2.2 秒DBSet.Add()
通话时间大约为 90 分钟。
我将代码重构为:
var tempItemList = new List<MyStuff>();
foreach(var item in listOfItemsToBeAdded)
{
//biz logic
tempItemList.Add(item)
}
context.MyStuff.ToList().AddRange(tempItemList);
运行时间大约为 4 秒。但是,那.ToList()
查询当前表中的所有项目,这是极其必要的,但从长远来看可能会很危险甚至更耗时。一种解决方法是做类似的事情context.MyStuff.Where(x=>x.ID = *empty guid*).AddRange(tempItemList)
因为那时我知道永远不会有任何回报。
但我很好奇是否还有其他人知道使用 EF Code First 进行批量插入的有效方法?
验证通常是 EF 中非常昂贵的部分,通过禁用它,我获得了很大的性能改进:
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;
我相信我在一个类似的问题中发现了这一点——也许就是这个答案 https://stackoverflow.com/a/11923527/60724
另一个答案 https://stackoverflow.com/a/5940267/60724关于这个问题正确地指出,如果您确实需要批量插入性能,您应该考虑使用System.Data.SqlClient.SqlBulkCopy
。对于此问题,在 EF 和 ADO.NET 之间进行选择实际上取决于您的优先级。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)