我已经使用实体框架将数据插入到SQL表中。
对于更大数量的记录,我使用Add()
而不是AddRange()
,并在以后致电SaveChanges()
。
插入记录仍然花费太多时间-是否有解决方案来提高速度?
_Repository.InsertMultiple(deviceDataList);
await _Repository.SaveAsync();
public void InsertMultiple(List<string> deviceDataList)
{
context.Devices.AddRange(devices);
}
答案 0 :(得分:1)
在Add上使用AddRange已经是一个很大的改进。它修复了应用程序中速度较慢的部分。
但是,<__main__.LP_c_double object at 0x7fe2fc93ab00>
仍然需要花费很多时间,因为对您保存的每个实体进行一次数据库往返。因此,如果要插入1万个实体,则将进行10,000次数据库往返,这非常慢。
免责声明:我是Entity Framework Extensions
的所有者该库不是免费的,但允许您执行所有批量操作,包括SaveChanges
和BulkSaveChanges
:
示例
BulkInsert
答案 1 :(得分:0)
如果在foreach或AddRange中使用Add都没有关系,问题就出在SaveChanges方法上,因为它可以将更改逐一存储在观察到的实体中。有一些库允许在SqlBulkCopy
的内部机制下使用实体批量插入实体链接到EF Core库:EFCore.BulkExtensions
编辑: 对于EF6,我发现了这个nuget:EntityFramework6.BulkInsert,但我个人没有使用它,因此我对此一无所知。
编辑2:我简化了这一点,在Add上使用AddRange可以增加将实体添加到更改跟踪器的时间,但是SaveChanges仍会花费很长时间,因此这不是解决方案。