2016-11-18 8 views
0

私はエンティティフレームワークでコードファーストと一対一の関係を実現しようとしています。 FlightPlanを持つ飛行機のテーブルを作成したいと思います。エンティティフレームワークと一対一の関係

飛行機:

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

次の表の構造が作成されます。

enter image description here

私が作成し管理した後、 FlightPlanを搭載した飛行機、タクいくつかの回避策がありますが、飛行機は何を試してもFlightplanを持っていません。

enter image description here

enter image description here

どのように私はこの問題を解決することができますか?

編集

はテスト目的のために私はすべての更新飛行機のフライトプランを追加します。これを修正した後、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

飛行計画を作成してDBに追加しましたか?飛行機/飛行計画作成コードを掲示する。 – Gusman

+0

モデルが正しいです。挿入コードを表示します。 http://www.entityframeworktutorial.net/EntityFramework4.3/add-one-to-one-entity-using-dbcontext.aspx –

+0

どうしてあなたは飛行機と飛行機の両方で 'AmountOfPassengers'を持っていますか?飛行機に乗っている人は能力があると思いますか? –

答えて

0

これは、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 

また、DBから引っ張ったときにFlightPlanプロパティが含まれるようにEFを強制することができます。

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

EFにFlightPlan properyが含まれていれば、そのトリックが実行されました!どうもありがとうございました! – 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

私が投稿したコードは動作し、次のデータテーブルを生成します: 'Airplane:int ID'、' FlightPlan:int Id、int AirplaneId'。あなたが投稿したリンクでは、「Person」クラスの定義さえ提供していません –

+0

あなたには表示されていない流暢なコードがない限り、「関係の主な終わりを特定できません」というエラーが表示されます。私はEF 6.1.3でそれを試しました。 –

関連する問題