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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:29