在MVC中以简单的层次结构构建模型,最佳做法是什么?

时间:2016-07-07 12:28:48

标签: c# asp.net-mvc entity-framework linq asp.net-mvc-4

我有3个型号:

项目

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; }

我想在我的项目索引视图中为每个项目的所有日志提供所有“总时间”的总和。在我的Job索引页面中,我可以通过在我的视图中对foreach循环中的总数进行求和来轻松完成此操作:

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

但是我不知道如何在我的项目页面上做同样的事情而不创建一个viewmodel或将ProjectID键添加到Logs模型中,这样我就可以在项目索引页面上为Projects执行上述操作。

我可以使用以下方法获取每个项目的第一个作业的总时间值:

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

但是我不知道如何写这个来总结每个工作的所有'总时间'。

我想知道的是最好的方法是什么。我是否必须以项目模型与作业模型相关的方式在我的日志模型中创建视图模型或向项目模型添加关系。我可能会遗漏哪些方法存在缺点或问题?当然有一种简单的方法可以让我使用上面使用的东西来获得项目的“总时间”?

我可能会告诉您只是想慢慢学习MVC。感谢。

2 个答案:

答案 0 :(得分:1)

您不需要使用视图模型,但我可能建议您这样做。我更喜欢在视图外部进行所有处理,因此您需要在控制器中进行计算并将总时间分配给视图模型中的属性。但是,在视图中完成相同的操作非常容易,只需在视图中添加这样的内容:

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

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

答案 1 :(得分:1)

使用视图模型来做到这一点,我强烈建议在控制器中进行良好的体系结构操作,以便:

控制器:

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