2017-04-19 191 views
0

私はbookからASP.NET MVCを学習する初心者です.IntCを実装するためにNInjectを使用しています。 JobDetailsビュー内の2つの異なるモデルからデータを表示

JobId<PK> 
LocationId<FK> 
JobName 

テーブル名 - - 場所

LocationId<PK> 
LocationName 

私は場所とJobDetailsのためのエンティティを作成している私は、

以下の表の名前として仕事と場所のためのデータモデルを作成しました以下のように

ジョブ詳細

public class JobDetails 
{ 
    [Key] 
    public int JOBID { get; set; } 

    public int LocationID { get; set; } 

    public string JOBNAME { get; set; } 
} 

public class Location 
{ 
    [Key] 
    public int LocationID{ get; set; } 

    public string LocationName { get; set; } 
} 

はまた、私は仕事と場所のための

public interface IJobDetails 
{ 
    IEnumerable<JobDetails> jobDetailsInterface { get; } 
} 


public interface ILocation 
{ 

    IEnumerable<Location> locationInterface { get; } 
} 

public class EFLocationRepository : ILocation 
{ 
    public EFDbContext context = new EFDbContext(); 

    public IEnumerable<Location> locationInterface 
    { 
     get { return context.Location; } 
    } 
} 

public class EFJobRepository : IJobDetails 
{ 
    public EFDbContext context = new EFDbContext(); 

    public IEnumerable<JobDetails> jobDetailsInterface 
    { 
     get { return context.JobDetails; } 
    } 
} 

マイ・モデル・クラス以下のようにジョブの詳細や場所についての私の抽象とコンテキストクラスを持っている場所のとおりです以下

public class JobListViewModel 
{ 
    public IEnumerable<JobDetails> jobDetails { get; set; } 
} 

public class LocationListViewModel 
{ 
    public IEnumerable<Location> Location { get; set; } 
} 

私のJobDetailコントローラーで、ロケーションIDの代わりにロケーション名を表示したいとします。 マイJobDetailコントローラは以下の通りである

public class JobController : Controller 
{ 
    public IJobDetails repository; 

    public JobController(IJobDetails job) 
    { 
     repository = job; 
    } 

    public ViewResult List() 
    { 
     return View(repository.jobDetailsInterface); 
    } 

} 

どのように私の仕事ビューに場所の名前の代わりに、ロケーションIDを表示するには?

N.B-私はAdam Freemanの本からMVCを学習していて、何か新しいものを作成しようとしています。私が行ったことが正しいかどうかを教えてください。

+0

EntityFrameworkを使用していますか?もしそうなら、 'repository.jobDetailsInterface.Location.LocationName'のようなジョブリポジトリを通してLocationNameにアクセスできるはずです。 – sleeyuen

+0

私はエンティティフレームワークを使用していますが、私はjobDetailsInterfaceを通じてlocationNameにアクセスできません – BSB

答えて

0

sleeyuenの応答に追加します。あなたは以下のように、JobDetailsモデルに「ナビゲーション」プロパティを追加することもできます。

public class JobDetails 
{ 
    [Key] 
    public int JOBID { get; set; } 

    public int LocationID { get; set; } 

    public string JOBNAME { get; set; } 

    public virtual Location JobLocation { get; set; } 
} 

次に、あなたがやってビューから場所名にアクセスすることができるはずです:repository.jobDetailsInterface.JobLocation.LocationName

あなたのシナリオでは、私は、エンティティフレームワークを信じますあなたは

を設定するエンティティの設定は必要ありませんので注意してください、モデル構造からの関係を推測することができるようになります、このアプローチは、このことができますN+1

希望につながる:)

+0

解決策は私のために働いています。私はN + 1問題に直面している方法を理解しませんでした。あなたは詳しく説明できますか? – BSB

+0

'' 'repository.jobDetailsInterface;' 'を呼び出すと、エンティティフレームワークは' 'JobLocation'''プロパティをロードしないため、N + 1につながると思います。'' 'JobLocation'''は、ビューから' '' LocationName'''プロパティにアクセスしようとしたとき(Lazyローディングと呼ばれる)とは別のsqlクエリとしてロードされます。この問題を解決するには、エンティティフレームワークがナビゲーションプロパティを熱心に読み込むようにする '' 'repository.jobDetailsInterface.Include(j => j.JobLocation)' ''を使用してください(これは[at msdn](https:// msdn。 microsoft.com/en-us/library/jj574232(v=vs.113).aspx) – Varinder

+0

説明のためにありがとう@Varinder – BSB

関連する問題