2016-07-07 65 views
1

我有3种型号:在MVC中以简单的层次结构模型,最佳实践是什么?

项目

public int ProjectID { get; set; } 
public string Description { get; set; } 
public string UserID { get; set; } 
[ForeignKey("UserID")] 
public virtual ApplicationUser User { get; set; } 

public virtual ICollection<Job> Jobs { get; set; } 

乔布斯

public int JobID { get; set; } 
    public int ProjectID { get; set; } 
    public string Title { get; set; } 
    public string Jobdescription { get; set; } 
    public string UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual ApplicationUser User { get; set; } 

    public virtual Project Projects { get; set; } 
    public virtual ICollection<Log> Logs { get; set; } 
    public virtual ICollection<Assignment> Assignments { get; set; } 

日志

public int LogID { get; set; } 
    public int JobID { get; set; } 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")] 
    public DateTime Logstart { get; set; } 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")] 
    public DateTime Logend { get; set; } 
    public int totaltime { get; set; } 
    public string Notes { get; set; } 
    public string UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual ApplicationUser User { get; set; } 
    public virtual Job Job { get; set; } 

我想有例如在我的项目索引视图的总和所有'总时间'为每个项目的所有日志。在我工作的索引页,我可以很容易地在我看来foreach循环这样的总结中的总量做到这一点:

@TimeSpan.FromMinutes(item.Logs.Sum(i => i.totaltime)) 

但是我不知道该怎么做同样的事情,我的项目页面上没有或者创造一个视图模型或将ProjectID键添加到日志模型,以便我可以在项目索引页上为项目执行上述操作。

我可以使用这个每个项目的第一份工作得到TOTALTIME值:

@TimeSpan.FromMinutes(item.Jobs.Sum(i => i.Logs.First().totaltime)) 

但是我不知道我该怎么写这个总结所有为每个作业“totaltimes”的。

我想知道的是什么是做到这一点的最好方法。我是否需要在项目模型与作业模型相关的方式下创建视图模型或将关系添加到我的日志模型中的项目模型中。这些方法有哪些缺点或问题可能会丢失?当然,有一种简单的方法可以让我使用上面使用的东西来实现项目的“总时间”?

我就像你刚才试图慢慢学习MVC一样。谢谢。

+4

您应该使用视图模型来表示要在视图中的信息的最终状态,你不应该试图以EF实体直接绑定到视图。 –

+0

感谢您的评论,我将使用视图模型。 – Rob

回答

1

你不需要使用视图模型,但我可能会推荐这样做。我更愿意在视图外进行所有处理,因此您需要在控制器中进行计算,并将总时间分配给视图模型中的属性。但是,这是很容易做到同样的事情在视图本身,就这样添加了一些看法:

@{ 
    var jobs = projects.Jobs; 
    var totalTime = jobs.Sum(job => job.Logs.Sum(x => x.totaltime)); 
} 

<p>Total time is @totalTime</p> 
+0

谢谢,我想我会使用一个viewmodel,但很高兴知道我可以这样做。 – Rob

1

使用视图模型要做到这一点,我强烈建议在控制好建筑做业务所以:

控制器:

var jobs = db.JobsList.ToList(); 
var totalTime = jobs.Sum(x => x.Logs).Sum(x => x.totaltime)); 
相关问题