在Entity Framework中批量插入记录并在批量插入后获取它们的Id。

3

我希望能够批量插入10万行以上到一个表中(该表有一个自增的标识列,每次插入新行时都会自动递增)。

  1. 什么是最快的插入方式,对性能影响最小?

  2. 在所有行都插入后,如何获取最近插入的行的ID列表?

注意:我尝试了以下方法,但没有得到插入行的ID列表。

ctx.Documents.AddRange(documentsList);
ctx.SaveChanges();

var ids = documentsList.Select(d => d.Id);

谢谢

2个回答

1

在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+不支持批量操作

目前两个库唯一共享的功能是批量删除批量更新


这些位与 "EF Plus" (http://entityframework-plus.net/) 是一样的吗? - marc_s

0
另一个库现在也可以做到这一点: https://github.com/borisdj/EFCore.BulkExtensions 它通过使用SetOutputIdentity BulkConfig选项来实现。在插入后,您列表中的C#对象的ID将被设置为数据库生成的值。在底层,BulkExtensions还使用了高效的批量复制实现,以确保插入速度快。

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