C# 如何使用AddRange使用大容量插入提高插入速度,然后在实体框架中保存更改

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.

我使用实体框架将数据插入到SQL表中

对于较大数量的记录,我使用了AddRange,并在以后调用了SaveChanges,而不是Add

插入记录仍然需要花费太多的时间-有没有提高速度的解决方案

_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的东西。可能我会在批准后将其用于其他产品: