2016-12-11 23 views
1

ステーションServiceLevelというモデルがあります。 ステーションには、ServiceLevelIdという外部キーが含まれています。このキーは、ServiceLevelテーブルの主キーを参照します。.NET C#:外部キーのプロパティを表示する方法?

しかし、Stationの一部であるServiceLevelプロパティを表示することはできません。

私は、書面によるビューの駅のプロパティを提示することができます

@Html.DisplayFor(model => model.Name) 

しかし、私が書く場合には、外国人のオブジェクトのプロパティが表示されません。

@Html.DisplayFor(model => model.ServiceLevel.Title) 

 

I誰かがなぜ私がそれがうまくいかないのか説明できたら本当に感謝します。

 

は.csとServiceLevelは.cs:

public class Station 
{ 
    public int StationId { get; set; } 
    public int Number { get; set; } 
    public string Name { get; set; } 

    public int? ServiceLevelId { get; set; } 
    [ForeignKey("ServiceLevelId")] 
    public ServiceLevel ServiceLevel { get; set; } 
} 

public class ServiceLevel 
{ 
    public int ServiceLevelId { get; set; } 
    [Required] 
    public string Title { get; set; } 
} 

メリークリスマス!

+0

ナビゲーションプロパティに仮想を追加してテストします。public virtual ServiceLevel ServiceLevel {get;セット; } – ArDumez

答えて

0

ServiceLevelプロパティは仮想ではないため、EF遅延ロードは機能しません。 Include()メソッドを使用して、Stationオブジェクトを照会するときにServiceLevelを明示的にロードする必要があります。これは、Eager Loadingと呼ばれます。

context.Stations.Include(x=>x.ServiceLevel).ToList(); 
0

これを有効にするには、 'virtual'キーワードを接頭辞として使用してServiceLevelを仮想化できます。これにより、POCOクラスへのプロキシの実行時作成が可能になり、呼び出すときに使用できるようになります。

public class Station 
{ 
    public int StationId { get; set; } 
    public int Number { get; set; } 
    public string Name { get; set; } 

    public int? ServiceLevelId { get; set; } 
    [ForeignKey("ServiceLevelId")] 
    public virtual ServiceLevel ServiceLevel { get; set; } 
} 

デフォルトでは、関連するエンティティは「virtual」キーワードで接頭辞を付けないとロードされないため、コードは失敗します。もう1つの方法は、Eagerをロードすることです。つまり、関連するエンティティを強制的にロードすることです。私の謙虚な意見では、そうする特別な理由がある以外は、これは最適な方法ではありません。

+0

こんにちは。ご回答有難うございます。あなたが言及したように、私は熱心な読み込みを避けようとしています。残念ながらvirtualキーワードを使用しても問題は解決しません。 @ Html.DisplayFor(model => model.ServiceLevel.Titleはまだ何も返しません。参考になります。 – Kasper

+0

おそらくチェックしたことがありますが、DBを調べて、データが実際に存在し、すべての参照が適切であることを確認しましたか?セット? – mmara

関連する問題