【问题标题】:Using ViewModel to fetch data from multiple tables?使用 ViewModel 从多个表中获取数据?
【发布时间】:2012-02-17 15:46:59
【问题描述】:

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

我想将这三个表组合成一个视图模型,以便我可以在一个视图中获取 Requestid、描述、批准者和执行状态。 这是我的第一次粗略尝试,似乎可行,但我觉得这是创建 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; }
}

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

【问题讨论】:

  • 你觉得有什么不妥之处? (不以任何方式评论它,但如果我们知道你不喜欢它并想要改变它,给你小费可能会更容易)
  • 构图相当不错,但是,您不应该在视图模型中包含private RequestsContext db = new RequestsContext();RequestExecutionViewModel()。另外,您可能想使用IList&lt;&gt; 而不是List&lt;&gt;
  • 谢谢吉姆。这也是我的担心。作为一个菜鸟,我想我错过了一些东西。

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


【解决方案1】:

构图相当不错,但是,您不应该在视图模型中包含private RequestsContext db = new RequestsContext();RequestExecutionViewModel()。此外,您可能想使用IList&lt;&gt; 而不是List&lt;&gt;

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

只有我的 2 美分

【讨论】:

  • 我的回答基本上是一样的,这很可能是要走的路,有时在 ViewModels 中进行查询和有时在控制器操作中进行查询的主要问题是不一致。如果您确实必须再次使用该视图模型来执行相同的查询,那么您会问为什么您不只是使用相同的操作。
【解决方案2】:

通常您会在 Controller Action 中构建模型,而不是在 ViewModel 代码本身中。样板映射代码虽然在 ViewModel 中可能很有用,但我认为不应该在那里查询数据库。

并非所有页面都必须有 ViewModel,如果有些在控制器中进行查询而有些在 ViewModel 中进行,则会导致数据库查询分散。

【讨论】:

  • 是的,Paul 令人惊讶的是,我所看到的所有答案都在解决 ViewModel 的某些方面,这对我来说非常有用。遗憾的是,stackoverflow 不允许标记多个好的答案。
【解决方案3】:

在我看来,这似乎很好。据我了解,应使用 ViewModel 将模型中的足够数据提供给您的视图,而您的视图正是这样做的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多