Server-Side Blazor中EF Code First同表双关联映射异常问题
实体类定义
先调整实体类,明确两个关联的导航属性与外键字段:
public class Band { public int Id { get; set; } public string Name { get; set; } // 原关联:乐队主乐手外键 public int BandsmanId { get; set; } // 新增:乐队鼓手外键 public int DrummerId { get; set; } // 主乐手导航属性 public Bandsman MainBandsman { get; set; } // 鼓手导航属性 public Bandsman Drummer { get; set; } } public class Bandsman { public int Id { get; set; } public string Name { get; set; } // 该乐手担任主乐手的所有乐队 public ICollection<Band> LeadBands { get; set; } = new List<Band>(); // 该乐手担任鼓手的所有乐队 public ICollection<Band> DrummedBands { get; set; } = new List<Band>(); }
Fluent API 映射配置
在DbContext的OnModelCreating方法中,显式配置两个一对多关联,指定外键与对应导航集合,避免EF自动推断出错:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置乐队-主乐手关联 modelBuilder.Entity<Band>() .HasOne(b => b.MainBandsman) .WithMany(bm => bm.LeadBands) .HasForeignKey(b => b.BandsmanId) .OnDelete(DeleteBehavior.Restrict); // 根据业务需求调整删除行为 // 配置乐队-鼓手关联 modelBuilder.Entity<Band>() .HasOne(b => b.Drummer) .WithMany(bm => bm.DrummedBands) .HasForeignKey(b => b.DrummerId) .OnDelete(DeleteBehavior.Restrict); }
验证迁移
执行以下命令生成并应用迁移:
Add-Migration AddDrummerToBand Update-Database
此时Band表只会生成BandsmanId和DrummerId两个外键列,不会出现自动生成的BandsmanId1/BandsmanId2。
注意:删除行为需根据实际业务调整,比如允许级联删除可改用DeleteBehavior.Cascade,禁止删除关联乐手则保留Restrict。
内容的提问来源于stack exchange,提问作者kinda-wired
相关产品推荐
相关产品推荐

