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

使用Linq2Db与EF Core批量插入时Id列未被正确识别的问题

解决方法

1. 批量插入时显式排除Id列

直接在BulkCopyOptions中指定排除Id字段,让LinqToDB插入时跳过该列,由数据库序列生成值:

public async Task AddAsync(IList<Item> items)
{
    var bulkOptions = new BulkCopyOptions
    {
        Columns = BulkCopyColumns.Exclude(item => item.Id)
    };
    await AppContext.BulkCopyAsync(bulkOptions, items);
}

2. 标记Id为数据库生成属性

通过EF Core的配置,将Id属性标记为添加时自动生成,让LinqToDB插件同步识别该配置:
修改表配置代码,补充HasDatabaseGeneratedOption设置:

public class ItemConfiguration : IEntityTypeConfiguration<Item>
{
    public void Configure(EntityTypeBuilder<Item> builder)
    {
        builder.HasKey(x => x.Id);
        builder.Property(x => x.Id)
            .HasDefaultValueSql($"NEXT VALUE FOR {BillOfLadingDbContext.ItemIdSequence}")
            .HasColumnOrder(0)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // 新增此行
    }
}

或者在DbContext的OnModelCreating中全局配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Item>()
        .Property(x => x.Id)
        .ValueGeneratedOnAdd();
}

3. 直接使用LinqToDB的映射配置

如果上述EF配置未生效,可以直接通过LinqToDB的Fluent映射标记Id为自增列:

public class ItemMapping : MappingSchema
{
    public ItemMapping()
    {
        var mapping = GetFluentMappingBuilder<Item>();
        mapping.Property(item => item.Id).IsIdentity();
    }
}

然后在初始化LinqToDB时注册该映射。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:30:32