ASP.NET MVC借助Entity Framework实现一对多关系时数据库Seeding Airport字段不生效问题
问题解决方案
你当前的核心问题是一对多关系配置错误:Flight实体存在两个外键关联Airport(出发机场、到达机场),但仅定义了单个Airport导航属性,EF无法自动匹配该导航属性对应的外键字段,也无法完成正确的关系映射,因此手动赋值后也无法写入数据库。
第一步:修正实体类关系配置
有两种配置方式可选,任选其一即可:
方式1:使用数据注解配置
修改Flight类:
public class Flight { public int FlightId { get; set; } public int DepartureAirportId { get; set; } public int ArrivalAirportId { get; set; } public DateTime FlightDateTime { get; set; } public int FlightDurationHours { get; set; } // 分别定义出发、到达机场对应的导航属性,标注关联的外键 [ForeignKey(nameof(DepartureAirportId))] public Airport DepartureAirport { get; set; } [ForeignKey(nameof(ArrivalAirportId))] public Airport ArrivalAirport { get; set; } }
修改Airport类:
public class Airport { public int AirportId { get; set; } public string AirportCode { get; set; } // 分别关联从该机场出发、到达该机场的航班集合 [InverseProperty(nameof(Flight.DepartureAirport))] public ICollection<Flight> DepartureFlights { get; set; } [InverseProperty(nameof(Flight.ArrivalAirport))] public ICollection<Flight> ArrivalFlights { get; set; } }
方式2:使用Fluent API配置
如果不想在实体类上加特性,可以在DbContext的OnModelCreating方法中添加如下配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置出发机场关联关系 modelBuilder.Entity<Flight>() .HasOne(f => f.DepartureAirport) .WithMany(a => a.DepartureFlights) .HasForeignKey(f => f.DepartureAirportId) .OnDelete(DeleteBehavior.Restrict); // 避免级联删除冲突,可按需调整 // 配置到达机场关联关系 modelBuilder.Entity<Flight>() .HasOne(f => f.ArrivalAirport) .WithMany(a => a.ArrivalFlights) .HasForeignKey(f => f.ArrivalAirportId) .OnDelete(DeleteBehavior.Restrict); }
第二步:调整种子数据逻辑
- 确保种子数据执行顺序:先插入所有Airport数据,再插入Flight数据,避免查询关联机场时返回null
- Flight初始化时不需要手动赋值导航属性,只要
DepartureAirportId和ArrivalAirportId值正确,EF会自动完成关联映射,如果需要手动赋值参考如下写法:
new Flight() { DepartureAirportId = 3, ArrivalAirportId = 7, FlightDateTime = new DateTime(2021, 12, 21, 08, 0, 0, 0), FlightDurationHours = 2, DepartureAirport = context.Airports.Find(3), ArrivalAirport = context.Airports.Find(7) }
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

