2017-09-18 9 views
0

ASP.NET MVCおよびEntity Frameworkを初めて使用しています。私はコード・ファースト・アプローチを使用してカー・ディーラー・プロジェクトを作成しています。フィエスタ、パンダ、318のようなモデルを格納するため、CarModel
...
ASP.NET MVC 5 EFコード最初に3つの関連テーブルからデータをロード

車、フォード、フィアット、BMWのようなブランドを格納するため、
CarBrand車のデータを格納するため..:私は3つのテーブル(クラス)を持っています

CarクラスにはFKからCarModelクラスがあります。 CarModelクラスには、FK to CarBrandがあります。私はすべての3つのテーブルからデータをロードする

public class Car 
{ 
    public int Id { get; set; } 
    public string Description{ get; set; } 
    public decimal Price{ get; set; } 

    public CarModel CarModel { get; set; } 
    public int CarModelId { get; set; } 

    ..... (more properties) 
} 

public class CarBrand 
{ 
    public int CarBrandId { get; set; } 
    public string Description{ get; set; } 
} 

public class CarModel 
{ 
    public int CarModelId { get; set; } 
    public string Description{ get; set; } 

    public int CarBrandId { get; set; } 
    public CarBrand CarBrand { get; set; } 
} 

:ここ

は私のクラスです。私はコントローラの次のコードで2つのテーブルからデータを読み込むことができます:

var cars = _context.Cars.Include(c => c.CarModel).ToList(); 

CarBrandからのデータもロードするには? ナビゲーションプロパティでクラスを正しくセットアップしましたか?

データをロードすると、ViewModelを格納して厳密な型指定されたビューに送信する必要があると思います。

瞬間に私のViewModelには、次のとおりです。

public class CarsModelsViewModel 
{ 
    public CarModel CarModel { get; set; } 
    public CarBrand CarBrand { get; set; } 
    public List<Car> Cars { get; set; } 
} 

答えて

0

複数のレベルを含めるには、それはIncludeの文字列のparam過負荷を利用する方が簡単です:

.Include("CarModel.CarBrand") 

しかし、あなたが同じ結果を得ることができ、単に追加のレベルを選択するだけでよい:

.Include(m => m.CarModel.Select(b => b.CarBrand)) 

synしかし、特に2つ以上のレベルの関連するエンティティでは、税金は少し厄介なものになり始めます。

個人的には、あなたのエンティティのデザインを少し変更すると思います。モデルとブランドの関係は、自動車とブランドの関係とは異なる目的を果たします。私の意見では、車にはブランドの外来キーを持たせるのが理にかなっています。

public class Car 
{ 
    public int Id { get; set; } 
    public string Description{ get; set; } 
    public decimal Price{ get; set; } 

    public CarBrand CarBrand { get; set; } 
    public int CarBrandId { get; set; } 

    public CarModel CarModel { get; set; } 
    public int CarModelId { get; set; } 

    ..... (more properties) 
} 

次に、あなただけの必要があります。

Include(m => m.CarBrand).Include(m => m.CarModel) 

これはまた、あなたがすべてを横断することなく、そのブランドに関連するすべての車を取得するために今CarBrandにコレクションナビゲーションプロパティを追加することができるという利点を持っていますCarModelの関係

var cars = brand.Cars; 
+0

返信クリスのおかげで、データの読み込み作品:あなたは、単にような何かを行うことができ

var cars = brand.Models.SelectMany(m => m.Cars); 

:他の言葉では、以前のに対し、あなたのような何かをする必要があると思います!今では、Carクラスに外部キーを追加することについてのあなたの提案を実装しています。更新されたクラスを使用して新しい移行を作成すると、次のエラーが発生します。FOREIGN KEY制約 'FK_dbo.Cars_dboの紹介。CarModels_CarModelId 'テーブルの' Cars 'は、サイクルまたは複数のカスケードパスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 –

関連する問題