批量插入记录并在实体框架中批量插入后获取其ID

时间:2017-11-01 18:49:30

标签: c# sql entity-framework entity-framework-6

我想将100,000多行批量插入表格(其中有一个标识列,每次插入新行时都会自动递增)。

  1. 插入性能影响最小的行的最快方法是什么?

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

  3. 注意:我做了以下但我没有得到ids列表

    ctx.Documents.AddRange(documentsList);
    ctx.SaveChanges();
    
    var ids = documentsList.Select(d => d.Id);
    

    由于

1 个答案:

答案 0 :(得分:0)

实体框架中没有Bulk Insert。您必须使用第三方库来执行此类操作。

默认情况下,Entity Framework将为每个要保存的实体进行数据库往返。因此,您的方案中需要超过100,000次数据库往返, INSANELY 缓慢。

免责声明:我是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;
});

编辑:回答问题

  

与#34; EF Plus"

相同的位

我也是Entity Framework Plus

的所有者

简而言之,我们将免费和付费功能分成两个库。 EF +不支持Bulk Operations

两个图书馆目前共享的唯一功能是Batch DeleteBatch Update