Использование ViewModel для получения данных из нескольких таблиц? - PullRequest
4 голосов
/ 17 февраля 2012

У меня есть 3 класса для правил, запросов, выполнений и утверждающих.

Я хочу объединить эти три таблицы в viewModel, чтобы я мог получить запрос, описание, утверждающие и статус выполнения в одном представлении,Вот моя первая грубая попытка, которая, кажется, работает, но я чувствую, что это очень неправильный способ создания 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 ]

4 голосов
/ 17 февраля 2012

композиция довольно хорошая, однако, вы не должны включать private RequestsContext db = new RequestsContext(); и RequestExecutionViewModel() в модель представления.Кроме того, вы можете захотеть использовать IList<> вместо List<>.

ваш доступ к БД должен выполняться на уровне службы или в действии контроллера и, вероятно, должен вводиться через некоторый контейнер IOC.

только мои 2 цента

2 голосов
/ 17 февраля 2012

Как правило, вы строите модель в действии Controller , а не в самом коде ViewModel.Код отображения Boilerplate хотя и может быть полезен во ViewModel, но запросы к базе данных, я не думаю, должны быть там.

Не все страницы обязательно будут иметь ViewModel, и это приведет к разбросу запросов к БД, если некоторые будут выполнять запросы в контроллере, а другие - в ViewModel.

1 голос
/ 17 февраля 2012

На мой взгляд, это в основном нормально. Насколько я понимаю, ViewModel следует использовать для предоставления достаточного количества данных из моделей в ваш View, что делает ваш.

Единственное, что я мог бы предложить, это, возможно, использовать шаблон Репозиторий вместо прямого использования RequestsContext, чтобы вы могли лучше проводить модульное тестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...