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丶
相关产品推荐
相关产品推荐

