pmulders pmulders - 13 days ago 5
C# Question

Realize Entity Framework one-to-one relation

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:

enter image description here

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.

enter image description here

enter image description here

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.

Answer

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();
Comments