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
相关产品推荐
相关产品推荐

