I am trying to realize a one-to-one relation in Entity Framework with Code First. I want to create an Airplane table which has a FlightPlan.
Airplane:
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; }
}
FlightPlan:
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; }
}
When i initialize these classes with Migrations the following table structure is created:
After i manage to create an Airplane with a FlightPlan, which takes some workarounds, the Airplane doesn't have a Flightplan no matter what i try.
How can i solve this?
Edit
For testing purposes i add a FlightPlan to every updated Airplane. After fixing this a route is created for adding a Flightplan. The code is:
var airplane = _context.Airplanes.Find(model.AirplaneId);
var flightplan = new FlightPlan() { AirfieldFrom = 1, AirfieldTo = 2, AmountOfPassengers = 30 };
airplane.FlightPlan = flightplan;
_context.SaveChanges();
The solution for my problem is to force EF to include the FlightPlan when retrieving an Airplane.
This is most likely due to lazy loading since your FlightPlan
is 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
You can also force EF to include the FlightPlan
property when pulling from the db.
using System.Data.Entity;
var airplane = db.Airplanes.Include(m => m.FlightPlan).First();