实现Entity Framework一对一关系

Realize Entity Framework one-to-one relation

我正在尝试使用 Code First 在 Entity Framework 中实现一对一关系。我想创建一个具有 FlightPlan 的飞机 table。

飞机:

public class Airplane
{
    [Key]
    public int AirplaneId { get; set; }
    public int Capacity { get; set; }
    public AirplaneStatus AirplaneStatus { get; set; }
    public int AmountOfPassengers { get; set; }
    public int AirfieldId { get; set; }

    public virtual FlightPlan FlightPlan { get; set; }
}

飞行计划:

public class FlightPlan
{
    [Key]
    [ForeignKey("Airplane")]
    public int AirplaneId { get; set; }
    public int AirfieldFrom { get; set; }
    public int AirfieldTo { get; set; }
    public int AmountOfPassengers { get; set; }

    public virtual Airplane Airplane { get; set; }
}

当我使用迁移初始化这些 类 时,会创建以下 table 结构:

在我设法创建带有 FlightPlan 的 Airplane 之后,这需要一些变通方法,但无论我尝试什么,Airplane 都没有 Flightplan。

我该如何解决这个问题?

编辑

出于测试目的,我为每个更新的飞机添加了一个飞行计划。修复此问题后,将创建一条用于添加飞行计划的路线。代码是:

var airplane = _context.Airplanes.Find(model.AirplaneId);
var flightplan = new FlightPlan() { AirfieldFrom = 1, AirfieldTo = 2, AmountOfPassengers = 30 };
airplane.FlightPlan = flightplan;
_context.SaveChanges();

我的问题的解决方案是强制 EF 在检索飞机时包含 FlightPlan。

这很可能是由于延迟加载,因为您的 FlightPlanvirtual

var airplane = db.Airplanes.First(); //pull airplane from db
var passengerAmount = airplane.FlightPlan.AmountOfPassengers //attempting to use 
// FlightPlan property after pulling Airplane from db should load the FlightPlan

您还可以强制 EF 在从数据库中拉取时包含 FlightPlan 属性。

using System.Data.Entity;
var airplane = db.Airplanes.Include(m => m.FlightPlan).First();

应按以下方式完成:

public class Airplane
{
    [Key]
    public int Id { get; private set; }

    public virtual FlightPlan FlightPlan { get; private set; }

    // ... other properties
}

public class FlightPlan
{
    [Key]
    public int Id { get; private set; }

    public virtual Airplane Airplane { get; private set; }

    // ... other properties
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<FlightPlan>()
       .HasRequired(flightPlan => flightPlan.Airplane)
       .WithOptional(airplane => airplane.FlightPlan);

       base.OnModelCreating(modelBuilder);
}

您的二传手当然可以是 public