根据this,可以使用以下代码制作实体中的批量插入:
var customers = GetCustomers();
db.Customers.AddRange(customers);
db.SaveChanges();
我使用SQL事件探查器来验证执行了多少个插入查询,我看到列表中的每个元素都有一个插入。
为什么?
答案 0 :(得分:3)
<强>的AddRange 强>
添加范围不会执行BulkInsert,只需在将所有实体添加到集合后检测一次。
DetectChange方法可能非常慢。
请参阅:Entity Framework - DetectChanges Performance
正如您所注意到的,它将实体逐个保存在数据库中,这种实体是INSANELY慢的。
<强> EF.Extended 强>
不再支持此库,并且没有批量插入功能。
批量插入库
有三个主要的库支持批量插入:
请注意,两个免费库都不支持所有继承和关联。
免责声明:我是该项目的所有者Entity Framework Extensions
除了批量插入外,此库还允许您执行所有批量操作:
示例:
// 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 Primary Key
context.BulkMerge(customers, operation => {
operation.ColumnPrimaryKeyExpression =
customer => customer.Code;
});
答案 1 :(得分:1)
这就是EF6如何做&#34;批量&#34;插入,它不是批量,而是逐行。结果表现很糟糕。
改为使用EF.BulkInsert或EFUtilities。
<强>更新强>
DbSet<T>.AddRange()
是内置API的一部分,这样您就不会使用EF.Extended或任何其他第三方库。