EF Core配置多对多关系时无法确定一对一依赖端报错如何解决
错误根因
无法确定'Artikel.Lager'与'Lager.Artikel'之间一对一关系的子/依赖端。若要识别关系的子/依赖端,请配置外键属性。如果这些导航属性不应属于同一关系,请在配置时不指定反向导航。
你提供的ER图也明确了Lager和Artikel是通过LagerArtikel关联的多对多关系:
这个报错是因为实体设计和多对多的配置要求完全不符,共有三处核心错误:
- 主实体的导航属性类型错误:
Lager里的Artikel、Artikel里的Lager都是一对一导航,EF会优先识别为一对一关系,找不到外键就直接报错 - 中间表实体结构错误:带自定义字段(这里的库存数量
Menge)的多对多中间实体,需要存储两个主表的外键,导航属性应该是对应单个主表实例,而非主表的集合 - 缺少显式的关系映射:带附加字段的多对多无法靠EF自动约定识别,必须手动配置关联关系
完整修复代码
1. 实体类修改
#region Data [Table("Lager")] public class Lager { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = ""; public string Strasse { get; set; } = ""; public string PLZ { get; set; } = ""; public string Ort { get; set; } = ""; // 导航到中间表集合,对应多对多 public ICollection<LagerArtikel> LagerArtikels { get; set; } } [Table("LagerArtikel")] public class LagerArtikel { public Guid Id { get; set; } = Guid.NewGuid(); // 放开外键注释 [ForeignKey("Lager")] public Guid LagerId { get; set; } [ForeignKey("Artikel")] public Guid ArtikelId { get; set; } public int Menge { get; set; } // 单个主表导航,而非集合 public Lager Lager { get; set; } public Artikel Artikel { get; set; } } [Table("Artikel")] public class Artikel { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = ""; public decimal EinkaufspreisNettoEuro { get; set; } // 导航到中间表集合,对应多对多 public ICollection<LagerArtikel> LagerArtikels { get; set; } } #endregion
2. DbContext添加关系配置
#region Context // => EF Core /* Add-Migration Initial -context _1_Testing.XDBContextTesting -o Migrations\XDBContextTestingMig add-migration -Name A3 -Project compDatMVP -context _1_Testing.XDBContextTesting Update-Database -context _1_Testing.XDBContextTesting */ public class XDBContextTesting : DbContext { public DbSet<Lager> Lager { get; set; } public DbSet<LagerArtikel> LagerArtikel { get; set; } public DbSet<Artikel> Artikel { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(new string(Konstanten.ConnectionString.Replace("#db#", "compDat__1__Testing"))); } // 添加模型配置方法 protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置多对多关联:两个主表分别和中间表是一对多关系 modelBuilder.Entity<LagerArtikel>() .HasOne<Lager>(la => la.Lager) .WithMany(l => l.LagerArtikels) .HasForeignKey(la => la.LagerId); modelBuilder.Entity<LagerArtikel>() .HasOne<Artikel>(la => la.Artikel) .WithMany(a => a.LagerArtikels) .HasForeignKey(la => la.ArtikelId); // 可选:如果不需要中间表单独的Id,可以设置复合主键,取消原来的Id属性即可 // modelBuilder.Entity<LagerArtikel>() // .HasKey(la => new { la.LagerId, la.ArtikelId }); } public XDBContextTesting() : base() { } public XDBContextTesting(DbContextOptions<XDBContextTesting> options) : base(options) { } } #endregion
验证修复
删除原有错误的迁移文件,重新执行迁移命令即可生成正确的表结构和关系。
内容的提问来源于stack exchange,提问作者fass33443423
相关产品推荐
相关产品推荐

