2016-11-18 6 views
0

Я пытаюсь реализовать отношение «один к одному» в Entity Framework с кодом First. Я хочу создать стол самолета, в котором есть FlightPlan.Realite Entity Framework отношение один к одному

Самолет:

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; } 
} 

Когда я инициализировать эти классы с миграциями следующая структура создается таблица:

enter image description here

После того как я смог создать Самолет с FlightPlan, который некоторые обходные пути, у Самолета нет Flightplan независимо от того, что я пытаюсь.

enter image description here

enter image description here

Как я могу решить эту проблему?

Редактировать

Для тестирования я добавить Flightplan к каждому обновленный самолет. После исправления этого маршрута создается для добавления 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 при получении самолета.

+1

Вы создали план полета и добавили его в БД? Опубликуйте код создания самолета/плана полета. – Gusman

+0

Ваша модель верна. Показать код вставки. http://www.entityframeworktutorial.net/EntityFramework4.3/add-one-to-one-entity-using-dbcontext.aspx –

+0

кстати, почему у вас есть «AmountOfPassengers» на обоих - полет и самолет? Является ли тот, который на самолете должен быть мощностью? –

ответ

0

Это, скорее всего, из-за ленивой загрузки, так как ваш 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 

Вы также можете заставить EF включить FlightPlan свойство при вытягивании из БД.

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

Принуждение EF к включению свойств FlightPlan сделало трюк! Большое спасибо! – pmulders

0

Должно быть сделано следующим образом:

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.

+0

Я считаю, что его код правильный. Этот код даст ошибку о невозможности определить основной конец отношения. https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449317867/ch04s07.html –

+0

Я не согласен, код, который я опубликовал, будет работать и будет генерировать следующие таблицы данных: 'Самолет: int ID',' FlightPlan: int Id, int AirplaneId'. В ссылке, которую вы опубликовали, они даже не содержат определения класса 'Person' –

+0

Если у вас нет четкого кода, который вы не показываете, вы получите сообщение об ошибке« Невозможно определить главный конец отношения ». Я просто попробовал это в EF 6.1.3. –