Существует несколько способов достижения этого, и у каждого есть свои плюсы и минусы. Вот несколько appraoches:
1) Domain Model Pattern
Автор шаблона модели домена, Мартин Фаулер, обеспечивает это определение (Fowler, 2003):
Объектная модель домена, который включает в себя как поведения и данных.
Используя этот шаблон, модели вашего домена будут определять поведение, которое может или не может быть переведено в запросы БД.
2) Repository Pattern
Используйте репозиторий, чтобы отделить логику, которая извлекает данные и отображает его в модели объекта из бизнес-логики, которая действует на модели. Бизнес-логика должна быть агностикой для типа данных, который содержит слой источника данных. Например, уровнем источника данных может быть база данных, список SharePoint или веб-служба.
Как отметил @Mehrdad, использование этого шаблона освобождает проблемы контроллера БД, и вся ваша логика БД остается в одном месте.
3) Command Query Separation pattern (мой любимый)
Он утверждает, что каждый метод должен быть либо команда, которая выполняет действие, или запрос, который возвращает данные в вызывающую, но не оба. Другими словами, задавая вопрос, не следует изменять ответ. Более формально методы должны возвращать значение только в том случае, если они являются ссылочно прозрачными и, следовательно, не имеют побочных эффектов.
Примечание: это ОКК и НЕ CQRS модель
Разница между CQS и Repository шаблона является то, что с Entity Framework, DbContext уже заворачивает хранилище шаблон для вас (DbContext единичная работы и DbSets являются репозиториями). Поэтому создание другого слоя репозитория является избыточным. То, что CQS дает вам, - это тщательный контроль над вашими запросами/командами и позволяет расширять их с помощью декораторов, которые могут обрабатывать дополнительную логику, не загрязняя основную бизнес-логику.Вот некоторые большие ссылки о CQS:
Это answer является отличным примером того, как репозиторий шаблон может получить использоваться с CQS вместе.
Все это может быть весьма подавляющим, поэтому я предлагаю вам не спешить, реализовать проекты Proof-OF-Concept, используя эти шаблоны и решить, какой из них лучше подходит для вашей общей архитектуры.
Не добавляйте к вам модели. Либо сделайте запрос в контроллере, либо попросите контроллер вызвать службу, которая возвращает результаты запроса –
Я не добавляю запрос к моей модели ?, все учебные пособия говорят, что контроллер не должен знать о какой-либо базе данных, это дата работа слоя доступа, то, как вы говорите мне, так я вижу во всех учебниках, но почему они так делают? –
Какие учебники вы имеете в виду? Учебники MS [Learn About ASP.NET MVC] (http://www.asp.net/mvc) имеют все свои контексты db в методах контроллера (хотя я предпочитаю использовать репозиторий с DI, как указано Mehrdad ниже). –