2012-02-17 43 views
4

我有3個規則,請求,執行和批准者的類。使用ViewModel從多個表中獲取數據?

我想這三個表組合成一個ViewModel,這樣我可以在一個單一視圖獲取的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; } 
} 

編輯:做模型內的數據庫查詢似乎是錯誤的。應該有更好的做事方式。

+0

你覺得有什麼不正確的嗎? (不以這種或那種方式對它進行評論,但是如果我們知道你不喜歡它並想改變它,可能會更容易給你一個提示) – 2012-02-17 15:54:00

+1

組成相當不錯,但是,你不應該包含在viewmodel中的'private RequestsContext db = new RequestsContext();'和'RequestExecutionViewModel()' 。另外,你可能想用'IList <>'而不是'List <>' – 2012-02-17 15:59:11

+0

謝謝jim。這也是我的擔心。做一個noob,我想我錯過了一些東西。 – drieddust 2012-02-17 16:02:08

回答

4

構圖相當不錯,但是,您不應該在視圖模型中包含private RequestsContext db = new RequestsContext();RequestExecutionViewModel()。另外,您可能需要使用IList<>而不是List<>

您的數據庫訪問應該在服務層或控制器操作中執行,並且可能應該通過某個IOC容器注入。

只是我的2美分

+0

我的答案基本上是一樣的,這是最有可能的方式,有時在ViewModels中執行查詢,有時在控制器操作中執行查詢的主要問題是不一致。如果您曾經使用相同的查詢再次使用該視圖模型,它會問你爲什麼不只是使用相同的操作。 – 2012-02-17 16:12:13

1

在我看來這似乎是大多數罰款。據我所知,應該使用一個ViewModel從模型中提供剛好足夠的數據給你的視圖。

我可以建議的唯一的另一件事可能是使用Repository pattern而不是直接使用RequestsContext,這樣你可以更好地進行單元測試。

2

通常你會做你的模型建立在你的控制器動作,而不是在視圖模型代碼本身。 Boilerplate映射代碼雖然可能在ViewModel中很有用,但是我不認爲應該在那裏查詢數據庫。

並不是所有的頁面都擁有的ViewModels必然,而這會導致散落的數據庫查詢,如果有的做查詢控制器,而一些在視圖模型做到這一點。

+0

是保羅令人驚訝的是,我所看到的所有答案都是針對ViewModel的某些方面,這對我來說很棒。可悲的是,stackoverflow不允許標記多個好的答案。 – drieddust 2012-02-17 17:57:50