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

EF Core执行迁移时Jobs表生成重复WorkerId列问题

问题原因

该问题确实是实体定义笔误+关系配置缺失导致的,核心诱因有3个:

  • 属性名大小写不匹配:C#是大小写敏感的语言,你在Jobs实体中定义的公司主键字段为Companykey(Key的k为小写),但FluentAPI配置Jobs复合主键时写的是J.CompanyKey(K为大写),EF Core会将二者识别为完全独立的两个属性,自动生成额外列。
  • 关联关系未显式配置:你仅配置了各实体的主键,没有显式绑定导航属性和外键字段的对应关系。当实体的主键是复合主键时,EF Core的默认约定无法准确识别你手动定义的WorkerId、Companykey就是关联外键,会自动生成新的外键列,导致列重复。
  • 实体定义存在类型笔误:Worker实体中声明Jobs导航属性时写的是List<Job>类型,但初始化时用的是new List<Jobs>(),类型名不匹配会进一步干扰EF Core的关联识别逻辑。
修复步骤
  1. 修正所有实体定义的笔误
    统一CompanyKey的大小写,修正Worker中导航属性的泛型类型,修正后的实体代码如下:
    public class Company
    {
        public string CompanyKey { get; set; } // 统一Key的K为大写
        public List<Jobs> Job { get; set; } = new List<Jobs>();
        public int WorkerId { get; set; }
        public Worker? worker { get; set; }
        public string Name { get; set; }
    }
    
    public class Worker 
    {
        public int WorkerId { get; set; }
        public string Name { get; set; } 
        public List<Company>? company { get; set; } = new List<Company>();
        public List<Jobs> Job { get; set; } = new List<Jobs>(); // 修正泛型类型为Jobs
    }
    
    public class Jobs
    {
        public string CompanyKey { get; set; } // 统一Key的K为大写
        public Company? company { get; set; } 
        public int WorkerId { get; set; } 
        public Worker? worker { get; set; }
        public string JobsKey { get; set; }       
    }
    
  2. 补全FluentAPI的关联配置,显式指定每段关系的外键字段,避免EF Core按约定自动生成冗余列,配置代码如下:
    // 配置Company主键及与Worker的关联
    builder.Entity<Company>()
        .HasKey(c => new { c.CompanyKey, c.WorkerId });
    builder.Entity<Company>()
        .HasOne(c => c.worker)
        .WithMany(w => w.company)
        .HasForeignKey(c => c.WorkerId);
    
    // 配置Worker主键
    builder.Entity<Worker>()
        .HasKey(w => w.WorkerId);
    
    // 配置Jobs主键、与Company的关联、与Worker的关联
    builder.Entity<Jobs>()
        .HasKey(j => new { j.CompanyKey, j.WorkerId, j.JobsKey });
    builder.Entity<Jobs>()
        .HasOne(j => j.company)
        .WithMany(c => c.Job)
        .HasForeignKey(j => j.CompanyKey);
    builder.Entity<Jobs>()
        .HasOne(j => j.worker)
        .WithMany(w => w.Job)
        .HasForeignKey(j => j.WorkerId);
    
  3. 删除之前生成的存在错误结构的迁移文件,重新执行Add-Migration生成新的迁移脚本,确认迁移脚本中没有冗余的WorkerId、CompanyKey列后,更新数据库即可。

注意:如果该库已经是生产环境使用的库,不要直接删除旧迁移,需要生成新的迁移文件,手动在迁移逻辑中删除EF Core之前自动生成的冗余列,避免出现数据丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:51:14