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

EF Core中调用UseModel()导致生成的表主键非默认Identity列

EF Core调用UseModel()后主键不再是Identity列的解决办法

问题分析

你手动通过SqlServerConventionSetBuilder构建模型并使用UseModel()后,生成的数据库表主键失去了默认的Identity属性——即使实体配置中没有调用ValueGeneratedNever()。这是因为手动构建模型的流程中,EF Core针对SqlServer的主键自动生成约定未被完整应用,模型构建时缺少了与数据库提供者关联的关键步骤。

解决方案

方案1:通过DbContext实例获取已正确构建的模型

避免手动创建ModelBuilder,利用临时DbContext实例生成模型,确保所有默认约定和提供者配置生效:

_builder.Services.AddDbContext<SlaveDataContext>((sp, options) =>
{
    // 构建临时DbContext选项,关联SqlServer配置
    var tempOptions = new DbContextOptionsBuilder<SlaveDataContext>()
        .UseSqlServer(_builder.Configuration.GetConnectionString("DataContext_slave"))
        .Options;

    // 创建临时上下文获取完整构建的模型
    using var tempContext = new SlaveDataContext(tempOptions);
    var readonlyModel = tempContext.Model;

    options
        .EnableDetailedErrors()
        .EnableSensitiveDataLogging()
        .UseSqlServer(_builder.Configuration.GetConnectionString("DataContext_slave"))
        .UseModel(readonlyModel);
});

方案2:在实体配置中显式指定主键生成策略

如果必须手动构建模型,在实体配置类中显式设置主键生成策略,强制启用Identity:

// 实体配置类示例
public class YourEntityConfiguration : IEntityTypeConfiguration<YourEntity>
{
    public void Configure(EntityTypeBuilder<YourEntity> builder)
    {
        builder.HasKey(e => e.Id);
        // 显式指定主键添加时自动生成,对应SqlServer的Identity列
        builder.Property(e => e.Id).ValueGeneratedOnAdd();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:05:19