使用EntityFramework Extended进行批量插入

3
根据this所述,可以使用以下代码进行实体的批量插入:
 var customers = GetCustomers();   
 db.Customers.AddRange(customers);   
 db.SaveChanges();  

我使用SQL Profiler验证了执行了多少个插入查询,我发现每个列表元素都有一个插入。

enter image description here

为什么?

是的,我只尝试了插入操作,但它没有起作用。也许是我做错了什么,因为我添加了包,但没有改变任何东西。代码还是一样的。 - Luis Teijon
这里有一个示例解决方案(https://code.msdn.microsoft.com/Entity-Framework-Batch-994cd739/view/SourceCode#content)。在宣称它不起作用之前,您应该尝试一下。 - Robert Harvey
请尝试这个示例解决方案。 - Robert Harvey
1
不管怎样,你需要精确地解决问题,逐个文件地进行处理,逐字逐句地检查。如果它能正常工作,那么你就完成了任务;如果不能正常工作,你需要向微软提交错误报告。 - Robert Harvey
1
问题在于,那篇链接的文章是误导性的:他们并不是批量插入,而是使用标准API。只有在安装了包并使用其API进行批量更新等操作后,才会进行插入。 - abatishchev
显示剩余6条评论
2个回答

3
这就是EF6进行“批量”插入的方式,它并不是真正的批量插入,而是逐行插入。因此性能很差。建议使用EF.BulkInsert或EFUtilities。请参考以下链接:EF.BulkInsertEFUtilities

他所链接的帖子指出正在使用 EntityFramework.Extended。请参见 https://code.msdn.microsoft.com/Entity-Framework-Batch-994cd739/sourcecode?fileId=150452&pathId=2085240737 - Robert Harvey
你的更新意味着什么?它不起作用是因为他实际上并没有使用EF.Extended,还是说他根本不需要EF.Extended? - Robert Harvey
那就是关键所在。我不确定我是否正在使用EF.Extended。我已经安装了它,但代码没有引用EF.Extended。 - Luis Teijon
1
DbSet<T>.AddRange()方法也会为列表中的每个元素执行一次插入操作(除了在EF Core中)。 - Carlos
批量操作支持EFCore.BulkExtensions 免责声明:我是作者。 - borisdj
显示剩余2条评论

3

AddRange

AddRange方法不执行BulkInsert,它只是在所有实体添加到集合后执行一次DetectChanges。

DetectChange方法可能非常慢。

参见:Entity Framework - DetectChanges Performance

正如您所注意到的,它会逐个将实体保存到数据库中,这非常慢。

EF.Extended

此库不再受支持,并且没有Bulk Insert功能。

Bulk Insert Library

有三个主要支持Bulk Insert的库:

请注意,这两个免费库不支持所有继承和关联。


免责声明:我是项目Entity Framework Extensions的所有者

除了Bulk Insert,此库还允许您执行所有批量操作:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge
  • BulkSynchronize

示例:

// 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;
});

如果我尝试创建一个存储过程来完成批量插入会怎样?我将从EntityFramework中调用该存储过程。 - Luis Teijon
1
存储过程不会像任何批量插入库那样快,并且需要更多的时间来进行编写,但是相比使用Entity Framework标准方式进行插入,你肯定能获得更好的性能提升。 - Jonathan Magnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接