实现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。
这很可能是由于延迟加载,因为您的 FlightPlan
是 virtual
。
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
。
我正在尝试使用 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。
这很可能是由于延迟加载,因为您的 FlightPlan
是 virtual
。
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
。