2017-04-19 64 views
0

我是一位學習ASP.NET MVC的新手,我正在使用NInject來實現IoC。我已經創造了工作和地點的數據模型如下在視圖中顯示來自兩種不同模型的數據

表名稱 - JobDetails

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-我正在從亞當弗里曼書中學習MVC,並試圖創造新的東西。請讓我知道我所做的是否正確。

+0

你在使用EntityFramework嗎?如果是這樣,您應該可以通過作業存儲庫(如repository.jobDetailsInterface.Location.LocationName)來訪問LocationName。 – sleeyuen

+0

我正在使用實體框架,但我無法訪問locationName通過jobDetailsInterface – 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問題,因爲我有1-1之間的JOB和位置模型之間的關係你能詳細說明嗎? – BSB

+0

我相信這會導致N + 1,因爲在調用repository.jobDetailsInterface時,實體框架不會加載JobLocation屬性。從我們試圖從視圖訪問LocationName屬性時(稱爲延遲加載),JobLocation作爲單獨的sql查詢被加載。修復將使用'''repository.jobDetailsInterface.Include(j => j.JobLocation)'''這將確保實體框架熱切地加載導航屬性,更多在這[在msdn上](https:// msdn。 microsoft.com/en-us/library/jj574232(v=vs.113).aspx) – Varinder

+0

感謝您的解釋@Varinder – BSB

相關問題