如何在实体框架中使用先使用AddRange然后先进行SaveChanges进行批量插入来提高插入速度

时间:2019-01-29 19:20:11

标签: c# entity-framework c#-4.0 entity-framework-6

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

对于更大数量的记录,我使用Add()而不是AddRange(),并在以后致电SaveChanges()

插入记录仍然花费太多时间-是否有解决方案来提高速度?

_Repository.InsertMultiple(deviceDataList);

await _Repository.SaveAsync();

public void InsertMultiple(List<string> deviceDataList)
{
    context.Devices.AddRange(devices);
}

2 个答案:

答案 0 :(得分:1)

在Add上使用AddRange已经是一个很大的改进。它修复了应用程序中速度较慢的部分。

但是,<__main__.LP_c_double object at 0x7fe2fc93ab00>仍然需要花费很多时间,因为对您保存的每个实体进行一次数据库往返。因此,如果要插入1万个实体,则将进行10,000次数据库往返,这非常慢


免责声明:我是Entity Framework Extensions

的所有者

该库不是免费的,但允许您执行所有批量操作,包括SaveChangesBulkSaveChanges

  • 批量保存更改
  • 批量插入
  • 批量删除
  • 批量更新
  • 批量合并

示例

BulkInsert

答案 1 :(得分:0)

如果在foreach或AddRange中使用Add都没有关系,问题就出在SaveChanges方法上,因为它可以将更改逐一存储在观察到的实体中。有一些库允许在SqlBulkCopy

的内部机制下使用实体批量插入实体

链接到EF Core库:EFCore.BulkExtensions

编辑: 对于EF6,我发现了这个nuget:EntityFramework6.BulkInsert,但我个人没有使用它,因此我对此一无所知。

编辑2:我简化了这一点,在Add上使用AddRange可以增加将实体添加到更改跟踪器的时间,但是SaveChanges仍会花费很长时间,因此这不是解决方案。