You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EFPlus BulkInsert如何获取数据库生成的ID?

如何在EF Plus BulkInsert后同步MSSQL IDENTITY列的ID到实体

当使用EF Plus的BulkInsert处理带有MSSQL自增IDENTITY列的实体时,默认确实不会自动将数据库生成的ID回写到实体对象中,但你可以通过配置专属选项来实现这个需求——这比BulkSynchronize或BulkMerge更适配纯插入场景。

核心解决方案:启用OutputIdentity选项

EF Plus的BulkInsert提供了OutputIdentity配置项,开启后会在批量插入完成后,自动将数据库生成的IDENTITY值同步回对应的实体属性,效果和EF原生SaveChanges()的行为一致。

具体代码示例:

// 准备待插入的实体(Id初始为0)
var entities = new List<Something> { new Something { Id = 0 } };

// 配置BulkInsert选项,启用Identity输出
var bulkOptions = new BulkInsertOptions
{
    OutputIdentity = true
};

// 执行批量插入
context.BulkInsert(entities, bulkOptions);

// 此时实体的Id已被更新为数据库生成的自增值
Assert.IsTrue(entities.First().Id != 0);

关键细节说明

  1. 实体属性配置要求:确保你的Something实体的Id属性已经被EF正确标记为自增列,比如通过数据注解:

    public class Something
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        // 其他业务属性...
    }
    

    或者用Fluent API配置:

    modelBuilder.Entity<Something>()
        .Property(s => s.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    
  2. 为什么BulkSynchronize/BulkMerge不适用:这两个方法的核心是同步数据(包含更新已有记录),设计目标不是单纯插入新实体并返回自增ID,因此无法精准匹配你的需求。

  3. 数据库兼容性:这个特性仅适用于支持IDENTITY列的数据库(比如MSSQL),其他数据库可能需要对应不同的配置逻辑。

内容的提问来源于stack exchange,提问作者stackOnRails

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:35