Нарушает ли доступ к базе данных из ViewModel принцип MVC? - PullRequest
4 голосов
/ 01 декабря 2011

Я пишу приложение в MVC2, используя Entity Framework

Насколько я знаю, ViewModel должен содержать только данные без какой-либо логики для базы данных. Предположим, у меня есть Product класс, который является сущностью ADO.NET и имеет EntityCollection<ProductToStatus>, когда ProductToStatus является таблицей «многие ко многим». У меня есть ProductModel (который принимает Product в своем .ctor), который передается в View.

public class ProductModel
{
    ....
    public Product Item {get; private set;}
    ...
    public ProductModel(Product item)
    {
         ...
         this.Item = item;
         ...
    }
}

В View Мне нужно отобразить все статусы продукта, поэтому для этого мне нужно запросить БД по item.ProductToStatus.Select(s=>s.ProductStatus).ToList(); в ProductModel, но это отправляет запрос в БД и, следовательно, нарушает Принцип MVC?

Это нормально, или мне нужно что-то сделать?

Ответы [ 2 ]

5 голосов
/ 01 декабря 2011

ты не должен этого делать. Ваш контроллер должен собрать данные, необходимые для вашего представления, и должен упаковать их и передать их представлению для визуализации.

Таким образом, ваш ProductModel должен либо взять детали Product, которые ему нужны, в своем конструкторе или через свойства (мои предпочтения), либо при толчке использовать Product, который ему дан для выполнения всех запросов в конструкторе, чтобы установить все свои внутренние поля, но не хранить ссылку на Product. Мне не нравится использование Product в конструкторе, особенно потому, что он выполняет работу в конструкторе, что не очень хорошо, но в зависимости от того, что он делает, это может быть нормально.

Вероятно, лучше, чтобы ваш ProductModel имел множество свойств, тогда вы можете создать его так:

var model = new ProductModel()
   {
       Statuses=product.ProductToStatus.Select(s=>s.ProductStatus).ToList(),
       Name=product.Name,
       OtherProperty=GetPropertyValue(product),
       //etc
    }
1 голос
/ 01 декабря 2011

Да, это нарушает схему. Вы должны заполнить вашу ViewModel в контроллере, а затем передать его на ваш вид.

Конечно, это будет работать, но это не идея модели-вида-контроллера.

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