如何使用实体框架的AddRange使用,然后调用SaveChanges批量插入增加插入速度

问题描述 投票:-1回答:2

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

对于较大数量的记录,而不是Add(),我已经使用AddRange()后来打电话SaveChanges()

它仍然花费过多时间插入记录 - 是否有任何解决方案,以提高速度?

_Repository.InsertMultiple(deviceDataList);

await _Repository.SaveAsync();

public void InsertMultiple(List<string> deviceDataList)
{
    context.Devices.AddRange(devices);
}
c# entity-framework c#-4.0 entity-framework-6
2个回答
0
投票

如果使用添加在foreach或的AddRange不要紧,问题就出在SaveChanges方法,因为它存储在观察实体逐一我想改变。有图书馆,在那里,允许实体真实的批量插入使用SqlBulkCopy引擎盖机制下

链接到EF核心库:EFCore.BulkExtensions

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

编辑2:我简化了这个,使用过的AddRange添加将提高增加实体来改变跟踪的时间,但还是会调用SaveChanges可能需要很长的时间,所以它不是一个解决方案。


1
投票

使用过的AddRange添加已经是一个很大的改进。它修复了这是在应用程序慢的部分。

然而,SaveChanges仍然需要大量的时间,因为一个数据库往返为您节省每实体制造。所以,如果你有10K实体插入10000数据库往返将作出这是出奇的慢。


免责声明:我Entity Framework Extensions的主人

该库是不是免费的,但可以让你执行所有的批量操作,包括BulkSaveChangesBulkInsert

  • 散装的SaveChanges
  • 批量插入
  • 批量删除
  • 批量更新
  • 散装合并

// 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;
});
© www.soinside.com 2019 - 2024. All rights reserved.