使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种

Posted

技术标签:

【中文标题】使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种【英文标题】:Seeding database with a one-to-many relationship in ASP.NET MVC using Entity Framework 【发布时间】:2021-12-28 07:26:58 【问题描述】:

在我的应用启动时努力正确地为我的数据库播种。 FlightIdDepartureAirportIdArrivalAirportIdFlightDateTimeFlightDurationHours 都已添加,但如何确保已添加 Airport 列。

我已经在AirportFlights 之间建立了与实体框架的一对多关系。

下面的代码在我的AddDbInitializer 类中,它在启动时运行。

new Flight()

    DepartureAirportId = 3,
    ArrivalAirportId = 7,
    FlightDateTime = new DateTime(2021, 12, 21, 08, 0, 0, 0),
    FlightDurationHours = 2,
    Airport = context.Airports.Find(3) // ADDED THIS LINE BUT IT DOESN'T WORK

飞行等级:

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; 
    public Airport Airport  get; set; 

机场等级:

public class Airport

    public int AirportId  get; set; 
    public string AirportCode  get; set; 

    public ICollection<Flight> Flight  get; set; 

【问题讨论】:

【参考方案1】:

你在拯救机场后context.SaveChanges()了吗?

你可以添加数据,但是如果你想引用它来添加额外的项目,你需要先提交它,否则它在技术上还不存在。

【讨论】:

是的,机场是在到达添加航班的位置之前添加的。 那么只要有AirportId == 3 的机场,您的代码就可以了。除此之外,您还需要提供有关问题所在的更多信息。描述您遇到的行为、错误消息等。 深究!因为我已经从我的数据库中删除了这些条目,所以我的 Airport ID 已经改变并且不是从 1 开始的。 我会更好地配置我的Flight 表,以便DepartureAirportIdArrivalAirportId 都是像Airport 这样的实际机场对象吗?当关系是一对多时,这甚至可能在一张表中有多个 Airport 对象吗?

以上是关于使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc实体框架代码先将外键与不同名称关联

实体框架探查器 - 带有 EF 6 的 ASP.NET MVC4 - 无法确定提供程序名称

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

ASP.NET C# MVC 实体框架

如何在我的实体框架和 ASP.NET MVC 项目中重构 connectionString?

如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪