我希望能够批量插入10万行以上到一个表中(该表有一个自增的标识列,每次插入新行时都会自动递增)。
什么是最快的插入方式,对性能影响最小?
在所有行都插入后,如何获取最近插入的行的ID列表?
注意:我尝试了以下方法,但没有得到插入行的ID列表。
ctx.Documents.AddRange(documentsList);
ctx.SaveChanges();
var ids = documentsList.Select(d => d.Id);
谢谢
我希望能够批量插入10万行以上到一个表中(该表有一个自增的标识列,每次插入新行时都会自动递增)。
什么是最快的插入方式,对性能影响最小?
在所有行都插入后,如何获取最近插入的行的ID列表?
注意:我尝试了以下方法,但没有得到插入行的ID列表。
ctx.Documents.AddRange(documentsList);
ctx.SaveChanges();
var ids = documentsList.Select(d => d.Id);
谢谢
在Entity Framework中没有Bulk Insert。您必须使用第三方库执行此类操作。
默认情况下,Entity Framework将为每个实体进行数据库往返以保存。因此,在您的情况下需要超过100,000次数据库往返,这是极其缓慢的。
免责声明:我是 Entity Framework Extensions 的所有者。
该库不是免费的,但可以让您执行所有批量操作,包括 BulkInsert
并自动返回 Id's
。 您还可以使用 IncludeGraph
选项插入相关实体:
示例
// 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;
});
编辑:回答问题
这些位是“EF Plus”相同的吗?
我也是Entity Framework Plus的所有者。
简而言之,我们将免费和付费功能分成两个库。EF+不支持批量操作
。
目前两个库唯一共享的功能是批量删除
和批量更新