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的关联识别逻辑。
修复步骤
- 修正所有实体定义的笔误
统一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; } } - 补全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); - 删除之前生成的存在错误结构的迁移文件,重新执行
Add-Migration生成新的迁移脚本,确认迁移脚本中没有冗余的WorkerId、CompanyKey列后,更新数据库即可。
注意:如果该库已经是生产环境使用的库,不要直接删除旧迁移,需要生成新的迁移文件,手动在迁移逻辑中删除EF Core之前自动生成的冗余列,避免出现数据丢失问题。
内容的提问来源于stack exchange,提问作者user16742580
相关产品推荐
相关产品推荐

