2017-04-19 44 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

相关问题