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

EF Code First如何将Destination表AirportCode设为Flights表两列外键

EF Code First 实现两个字段同时关联同一张主表的外键配置

问题根因

你之前的写法错误是因为两个外键共用了同一个导航属性,EF会判定你是在修改同一个关联规则,导致后续配置直接覆盖了前序配置,最终只会生成一个外键。

修复步骤

1. 修改实体类,补充对应数量的导航属性

Flight表需要给两个外键各配置独立的Destination导航属性,Destinations表也需要对应两个关联的Flight集合属性:

public class Flight
{
    public int Id { get; set; }

    [Required]
    public string DepartureAirportCode { get; set; }   
    [Required]
    public string ArrivalAirportCode { get; set; }    

    // 两个外键分别绑定独立导航属性
    public Destinations DepartureAirport { get; set; }
    public Destinations ArrivalAirport { get; set; }
}

public class Destinations
{
    public int Id { get; private set; }
    public string AirportCode { get; private set; }
    // 分别对应出发、到达两个维度的关联航班集合
    public IEnumerable<Flight> DepartureFlights { get; set; }
    public IEnumerable<Flight> ArrivalFlights { get; set; }
}

2. 修改DbContext的FluentAPI配置

每个关联单独配置,分别绑定对应导航属性,注意修改级联删除规则,避免SQL Server出现循环级联删除报错:

// 配置出发机场关联
builder.Entity<Flight>()
    .HasOne(x => x.DepartureAirport)
    .WithMany(x => x.DepartureFlights)
    .HasForeignKey(x => x.DepartureAirportCode)
    .HasPrincipalKey(x => x.AirportCode)
    .OnDelete(DeleteBehavior.Restrict);

// 配置到达机场关联
builder.Entity<Flight>()
    .HasOne(x => x.ArrivalAirport)
    .WithMany(x => x.ArrivalFlights)
    .HasForeignKey(x => x.ArrivalAirportCode)
    .HasPrincipalKey(x => x.AirportCode)
    .OnDelete(DeleteBehavior.Restrict);

3. 修复迁移文件

完成上述配置后重新生成迁移:

  • 如果还没把错误的迁移更新到数据库,可以直接删除之前生成的错误迁移文件,重新执行Add-Migration命令,会自动生成同时添加两个外键的迁移代码
  • 如果已经更新到数据库,可以手动修改生成的迁移代码,在删除旧外键的逻辑后,补加ArrivalAirportCode的外键创建逻辑:
migrationBuilder.AddForeignKey(
    name: "FK_Flight_Destinations_ArrivalAirportCode",
    table: "Flight",
    column: "ArrivalAirportCode",
    principalTable: "Destinations",
    principalColumn: "AirportCode",
    onDelete: ReferentialAction.Restrict);

内容的提问来源于stack exchange,提问作者hanushic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:45:00