C# 如何使用AddRange使用大容量插入提高插入速度,然后在实体框架中保存更改
我使用实体框架将数据插入到SQL表中 对于较大数量的记录,我使用了AddRange,并在以后调用了SaveChanges,而不是Add 插入记录仍然需要花费太多的时间-有没有提高速度的解决方案C# 如何使用AddRange使用大容量插入提高插入速度,然后在实体框架中保存更改,c#,entity-framework,c#-4.0,entity-framework-6,C#,Entity Framework,C# 4.0,Entity Framework 6,我使用实体框架将数据插入到SQL表中 对于较大数量的记录,我使用了AddRange,并在以后调用了SaveChanges,而不是Add 插入记录仍然需要花费太多的时间-有没有提高速度的解决方案 _Repository.InsertMultiple(deviceDataList); await _Repository.SaveAsync(); public void InsertMultiple(List<string> deviceDataList) { context.
_Repository.InsertMultiple(deviceDataList);
await _Repository.SaveAsync();
public void InsertMultiple(List<string> deviceDataList)
{
context.Devices.AddRange(devices);
}
无论您是在foreach还是AddRange中使用Add,问题都在于SaveChanges方法,因为我认为它将更改逐个存储在观察到的实体中。有一些库允许使用的引擎盖下机制进行实体的真正批量插入 链接到EF核心库: 编辑: 对于EF6,我发现了这个nuget:但我个人没有使用过它,所以我不能对它说什么
编辑2:我简化了这一点,使用AddRange over Add将缩短向change tracker添加实体的时间,但保存更改可能需要很长时间,所以这不是一个解决方案。使用AddRange over Add已经是一个很大的改进。它修复了应用程序中速度较慢的部分 但是,SaveChanges仍然需要很多时间,因为您保存的每个实体都有一个数据库往返。所以,如果您要插入10k个实体,那么将进行10000个数据库往返,这是非常慢的 免责声明:我是 此库不是免费的,但允许您执行所有批量操作,包括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;
});
您的代码太零碎,无法获得连贯的图像_存储库与设备存储库、设备催化剂与设备。我们需要看到整个过程,以便能够对其做出合理的解释。也许创建设备很费时,我们说不出来。同时给出你正在处理的项目的数量。我已经更新了问题。哦,太好了,任何更多有用的代码片段都会有帮助。谢谢。无论你是在foreach还是AddRange中使用Add都没有关系,相反,它可能会产生巨大的影响。谢谢你能添加一些示例代码片段吗?这将是一个非常好的选择help@GertArnold是的,我知道它会让事情变得更快,甚至更快,但改变仍然需要很长时间,它仍然不能解决我们的问题。这是我对这个主题的简化。这是一个很好的帮助,谢谢你,但我正在寻找一些我可以免费使用EF的东西。可能我会在批准后将其用于其他产品: