C# EF迁移自动生成多余Kasa_Id字段导致集合操作失效问题咨询
问题原因
这是EF Core外键约定匹配失败导致自动生成了影子外键字段 Kasa_Id:
你的KasaHareket实体中存在两个指向Kasa实体的导航属性:
public Kasa Kasa { get; set; }(对应显式声明的KasaId外键)public Kasa Kasa2 { get; set; }(对应显式声明的Kasa2Id外键)
而Kasa实体中只声明了一个集合导航属性public List<KasaHareket> KasaHareket { get; set; },EF Core无法自动判断这个集合应该关联到KasaHareket的哪个Kasa外键,因此自动生成了额外的影子外键Kasa_Id来绑定这个集合关系,就出现了冗余字段。你添加的聚合查询用到了Kasa.Hareket集合,触发了EF的关系解析逻辑,所以会复现这个问题。
可行解决方案
二选一即可,配置完成后删除旧的错误迁移,重新生成并执行新迁移就能删掉冗余的Kasa_Id字段。
方案1:用数据注解显式指定关联
在Kasa的集合导航属性上添加[InverseProperty]注解,指明它对应KasaHareket的哪个导航属性:
public class Kasa : BaseEntityDurum { // 其他原有属性保持不变 [InverseProperty(nameof(KasaHareket.Kasa))] public List<KasaHareket> KasaHareket { get; set; } // 如果需要关联Kasa2对应的流水,可额外加对应的集合属性 // [InverseProperty(nameof(KasaHareket.Kasa2))] // public List<KasaHareket> Kasa2Hareket { get; set; } }
方案2:用Fluent API在DbContext中配置关系
在你的DbContext的OnModelCreating方法中显式配置关联规则:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置Kasa和KasaHareket的关联 modelBuilder.Entity<Kasa>() .HasMany(k => k.KasaHareket) .WithOne(h => h.Kasa) .HasForeignKey(h => h.KasaId) .OnDelete(DeleteBehavior.Restrict); // 可按需调整删除行为 // 如需配置Kasa2的关联也可以添加对应规则 // modelBuilder.Entity<Kasa>() // .HasMany(k => k.Kasa2Hareket) // .WithOne(h => h.Kasa2) // .HasForeignKey(h => h.Kasa2Id) // .OnDelete(DeleteBehavior.Restrict); }
内容的提问来源于stack exchange,提问作者Mustafa Karabenli
相关产品推荐
相关产品推荐

