我已经使用实体框架将数据插入到SQL表。
对于较大数量的记录,而不是Add()
,我已经使用AddRange()
后来打电话SaveChanges()
。
它仍然花费过多时间插入记录 - 是否有任何解决方案,以提高速度?
_Repository.InsertMultiple(deviceDataList);
await _Repository.SaveAsync();
public void InsertMultiple(List<string> deviceDataList)
{
context.Devices.AddRange(devices);
}
如果使用添加在foreach或的AddRange不要紧,问题就出在SaveChanges方法,因为它存储在观察实体逐一我想改变。有图书馆,在那里,允许实体真实的批量插入使用SqlBulkCopy引擎盖机制下
链接到EF核心库:EFCore.BulkExtensions
编辑:对于EF6我发现这个的NuGet:EntityFramework6.BulkInsert但我没有亲自使用过它,所以我不能说什么。
编辑2:我简化了这个,使用过的AddRange添加将提高增加实体来改变跟踪的时间,但还是会调用SaveChanges可能需要很长的时间,所以它不是一个解决方案。
使用过的AddRange添加已经是一个很大的改进。它修复了这是在应用程序慢的部分。
然而,SaveChanges
仍然需要大量的时间,因为一个数据库往返为您节省每实体制造。所以,如果你有10K实体插入10000数据库往返将作出这是出奇的慢。
免责声明:我Entity Framework Extensions的主人
该库是不是免费的,但可以让你执行所有的批量操作,包括BulkSaveChanges
和BulkInsert
:
例
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);
// Customize Bulk Operations
context.BulkInsert(customers, options => {
options => options.IncludeGraph = true;
});
context.BulkMerge(customers, options => {
options.ColumnPrimaryKeyExpression =
customer => customer.Code;
});