2012-02-17 4 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

Что вы думаете об этом неправильно? (Не комментируя это так или иначе, но было бы легче дать вам подсказку, если бы мы знали, что вам не понравилось и хотели изменить) –

+1

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

+0

спасибо jim. Это тоже мое беспокойство. Как ничто, я думаю, что чего-то не хватает. – drieddust

ответ

4

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

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

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

+0

Мой ответ в основном то же самое, это, скорее всего, путь, основная проблема с иногда выполнением запросов в ViewModels и иногда выполнение его в действиях контроллера является несогласованностью. Если вам когда-либо приходилось использовать эту модель представления снова с тем же запросом, то она задала бы вопрос о том, почему вы не просто использовали одно и то же действие. –

1

По-моему это кажется в основном прекрасным. Насколько я понимаю, ViewModel следует использовать для предоставления достаточно данных от Модели (ов) к вашему представлению, что и делает.

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

2

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

Не все страницы будут иметь ViewModels обязательно, и это приведет к разбросу запросов DB, ​​если некоторые из них выполняют запросы в контроллере, а некоторые - в ViewModel.

+0

yes Пол удивительно, что все ответы, которые я видел, касаются какого-то аспекта ViewModel, который отлично подходит для меня. К сожалению, stackoverflow не позволяет отмечать более одного хорошего ответа. – drieddust

Смежные вопросы