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

C# Entity Framework Model First插入Identity列迁移报错求助

问题解决方法

报错原因

EF Core 的 HasData() 种子数据方法要求所有实体的主键属性必须显式赋值,即使主键配置为自增标识列也不例外。这是因为EF生成迁移脚本时需要通过主键值判断种子数据是新增、修改还是删除,该规则和实际运行时数据库自增生成id的逻辑互不冲突。

解决步骤

  • 给 HasData() 方法内的 EmpModel 实体手动指定id值,按照报错提示使用负值即可,避免和后续数据库自动生成的正数值产生冲突
  • 你现有代码中重复配置了主键和自增属性,可以直接删除冗余配置,模型类已经通过Attribute完成了相关声明

修改后代码

protected override void OnModelCreating(ModelBuilder builder)
{
    EmployeeFile file = new EmployeeFile();
    var response = file.GetData(); // 获取自定义数据

    builder.Entity<EmpModel>().HasData(
        new EmpModel()
        {
            // 手动指定负值id,仅用于EF迁移阶段标识,不会实际存入数据库
            id = -1,
            NPI = response.npiId,
            Name = response.FullName
        }
    );
    
    // 以下两行配置和模型类的Attribute声明重复,可直接删除
    // builder.Entity<EmpModel>().Property(p => p.id).ValueGeneratedOnAdd();
    // builder.Entity<EmpModel>().HasKey(x => new { x.id});
}

补充说明

修改完成后重新执行 Add-Migration 命令即可正常生成迁移脚本,执行迁移后种子数据存入数据库时,SQL Server会自动生成identity标识列的正数值,你手动设置的负值仅用于迁移阶段的逻辑判断,不会实际写入数据库表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:15:02