【问题标题】:How to increase insert speed using Bulk insert using AddRange and then SaveChanges in Entity Framework如何在实体框架中使用 AddRange 然后 SaveChanges 使用批量插入来提高插入速度
【发布时间】:2019-01-29 19:20:11
【问题描述】:

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

对于更多的记录,我使用了AddRange(),而不是Add(),后来又调用了SaveChanges()。

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

_Repository.InsertMultiple(deviceDataList);

await _Repository.SaveAsync();

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

【问题讨论】:

  • 您的代码过于碎片化,无法获得连贯的画面。 _Repository vs _deviceRepository,deviceDataList vs devices。我们需要看到整个过程才能说出任何明智的事情。也许创建devices 很耗时,我们无法判断。还要说明您正在处理的项目数量。
  • 我更新了问题。

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


【解决方案1】:

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

但是,SaveChanges 仍然需要很多时间,因为您保存的每个实体都会进行一次数据库往返。因此,如果您要插入 10,000 个实体,则将进行 10,000 次数据库往返,这INSANELY很慢。


免责声明:我是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;
});

【讨论】:

  • 这是一个很好的帮助,谢谢,但正在寻找我可以免费与 EF 一起使用的东西。一旦获得批准,我可能会将其用于其他产品:)
【解决方案2】:

在 foreach 或 AddRange 中使用 Add 都没关系,问题在于 SaveChanges 方法,因为我认为它会一一存储观察到的实体中的更改。有一些库允许使用 SqlBulkCopy 的引擎盖机制真正批量插入实体

EF Core 库链接:EFCore.BulkExtensions

编辑: 对于 EF6,我发现了这个 nuget:EntityFramework6.BulkInsert,但我没有亲自使用过它,所以我不能说什么。

编辑 2:我对此进行了简化,使用 AddRange 而不是 Add 将缩短将实体添加到更改跟踪器的时间,但 SaveChanges 仍然可能需要很长时间,所以这不是一个解决方案。

【讨论】:

  • 哦,很棒的代码 sn-p 有用的任何东西都会有所帮助。谢谢。
  • 在 foreach 或 AddRange 中使用 Add 都没关系 -- 恰恰相反,它可能会产生巨大的影响。
  • 谢谢你能添加一些示例代码sn-p这将是一个很大的帮助
  • @GertArnold 是的,我知道它会让事情变得更快,甚至很多,但是 SaveChanges 仍然需要很长时间,它仍然不能解决我们的问题。那是我对这个主题的简化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多