使用ViewModel从多个表中获取数据?

时间:2012-02-17 15:46:59

标签: c# asp.net-mvc model-view-controller viewmodel

我有3个类用于规则,请求,执行和批准者。

我想将这三个表组合成一个viewModel,以便我可以在一个视图中获取Requestid,description,approvers和execution status。 这是我的第一次粗略尝试似乎有效但我觉得这是非常不正确的创建ViewModel的方式。请提出更好的方法。

public class Rules
{
    [Required]
    public virtual int RulesId { get; set; }
    [Required]
    public virtual string RulesDescription { get; set; }
    [Required]
    public virtual int ApprovalLevels { get; set; } //if 0 then auto approved.
    [Required]
    public virtual string Requestor { get; set; }
}

public class Requests
{
    [Required]
    public virtual int RequestsId { get; set; }
    [Required]
    public virtual DateTime RequestTime { get; set; }
    [Required]
    public virtual bool isCompleted { get; set; }
    [Required]
    public virtual string UserName { get; set; }
    [Required]
    public virtual int RulesId { get; set; }
    public virtual string Description { get; set; }
}

public class ExecutionStatus
{   
    [Required]
    public virtual int ExecutionStatusId { get; set; }
    [Required]
    public virtual int RequestId { get; set; }
    [Required]
    public virtual int CurrentApproverLevel { get; set; } 
    [Required]
    public virtual string ApprovalStatus { get; set; }
}
public class Approvals
{
    [Required]
    public virtual int ApprovalsId { get; set; }
    [Required]
    public virtual int RulesId { get; set; }
    [Required]
    public virtual int ApproverLevel { get; set; }
    [Required]
    public virtual string ApproverName { get; set; }
}



public class RequestExecutionViewModel
{
    private RequestsContext db = new RequestsContext();
    public RequestExecutionViewModel(string username) 
    {
          this.Request = db.Requests.Where(a => a.UserName.Equals(username)).First();
          //aa = db.Approvals.Where(a => a.RulesId.Equals(Request.RulesId));
          this.Approvals = (List<Approvals>) db.Approvals.Where(a => a.RulesId.Equals(Request.RulesId)).ToList();
          this.ExecutionStatus = (List<ExecutionStatus>)db.ExecutionStatus.Where(a => a.RequestId.Equals(Request.RequestsId)).ToList();
    }

    [Required]
    public virtual int RequestExecutionViewModelId { get; set; }
    public Requests Request   {get;set;}
    public List<Approvals> Approvals { get; set; }
    public List<ExecutionStatus> ExecutionStatus { get; set; }
}

编辑:在模型中进行数据库查询对我来说似乎不对。应该有更好的做事方式。

3 个答案:

答案 0 :(得分:4)

组合相当不错,但是,您不应该在viewmodel中包含private RequestsContext db = new RequestsContext();RequestExecutionViewModel()。另外,您可能希望使用IList<>而不是List<>

您的数据库访问应该在服务层或控制器操作中执行,并且应该通过一些IOC容器注入。

只是我的2美分

答案 1 :(得分:2)

通常,您可以在控制器操作中进行模型构建,而不是在ViewModel代码本身中进行构建。虽然Boilerplate映射代码在ViewModel中很有用,但是我认为不应该在那里查询数据库。

并非所有页面都必然具有ViewModel,如果某些页面在控制器中执行查询,而某些页面在ViewModel中执行查询,则会导致数据库查询四处散布。

答案 2 :(得分:1)

在我看来,这似乎很好。据我所知,应该使用ViewModel从模型中提供足够的数据到您的View,而不是你的。

我建议的唯一另一件事是使用Repository pattern而不是直接使用RequestsContext,这样您就可以更好地进行单元测试。