V
V
Vladislav2015-02-14 08:12:36
ASP.NET
Vladislav, 2015-02-14 08:12:36

How to properly call EF context in asp.net controller?

В статье на хабре habrahabr.ru/post/250009 в комментариях хабраюзер с ником OnYourLips написал
> using (ApplicationDbContext db = new ApplicationDbContext())
> В контроллере это кажется ужасным.
Вопрос, а как тогда правильно и не ужасно? Где посмотреть best practices? На хабре я ридонли, так что не могу спросить непосредственно там.

Answer the question

In order to leave comments, you need to log in

3 answer(s)
Валерий Абакумов, 2015-02-20
@Valeriy1991

Всем добрый день!
Правильно - создавать трехслойную архитектуру
Открывать контекст EF в методе действия контроллера - плохая практика. Плохая потому что:
1. это не соответствует трехуровневой архитектуре, а следовательно, значительно усложняет внесение изменений, масштабирование и сопровождение приложения;
2. это сразу показывает низкий уровень понимания шаблона MVC - могут даже на работу не взять;
3. EF - это модель. А контроллер по сути своей должен лишь получить данные (модель) и передать их в представление. То, каким образом формируются данные (EF, NHibernate, XML, Files, ...) - контроллер не должно волновать. Он лишь организовывает данные, чтобы передать их в представление. Часто модель разделяют на непосредственно модель и модель представления (аналог шаблона MVVM). Контроллер получает данные (модель), из них формирует модель представления и её передает в само представление. Зачем это надо - уже другой вопрос.
Далее - позволю себе не согласиться с инициализацией контекста EF на весь контроллер - можно, конечно, но это, опять-таки, плохая практика, потому что:
1. возникнут проблемы с использованием многопоточности и параллельных вычислений при работе с контекстом (библиотека TPL);
2. возникнет проблема "устаревания" данных - т.к. контекст создан на контроллер, то придется постоянно его обновлять;
3. это, опять же, показывает уровень и опыт разработчика, а следовательно, снижаются шансы при трудоустройстве (туда, где я сейчас работаю - точно не взяли бы программистов, которые практикуют формирование модели в контроллере или которые инициализируют контекст в контроллере или при запросе).
Итог: контекст EF должен существовать как можно меньшее время - ровно столько, чтобы получить данные, обработать их, сформировать из них, например, другие объекты (обертки, модели, модели представлений).
Читайте книгу "ASP.NET MVC 3/4/... Framework с примерами на C# для профессионалов" Адама Фримена и Стивена Сандерсона - там, можно сказать, приведены best practices по разработке в ASP.NET MVC с использованием EF.
А вообще - всё зависит от задачи/проекта. Если это какой-нибудь учебный проект или ооооочень простое приложение - то можно для упрощения контекст инициализировать и в методе действия (контекст на метод действия), и при запросе (контекст на контроллер). Однако если Вы хотите повышать свой профессиональный уровень и заниматься enterprise-приложениями, то опытным путем Вы выясните, что самый лучший способ - это инициализация контекста на конкретную задачу.
Удачи!
P.S. Ничего плохого не имею против хабра (сам частенько читаю), но хабр - это не учебник, а источник разрозненной, но полезной информации. А Вам сейчас, судя по всему, нужна теория Структурированная теория. Найдите время и изучите "мат.часть". Поверьте, большинство вопросов по разработке на ASP.NET MVC у Вас просто отпадет.

Евгений, 2015-02-14
@Eugene22

Ничего ужасного тут нет, вполне допустимо.

Сергей, 2015-02-16
@senal

Обычно ASP.NET stateless поэтому создавать свой контекст на каждый запрос это правильно. Вариант создавать контекст в action имеет право на жизнь, но мне больше нравиться так:

public class RequestsController : Controller
    {
        /// <summary>
        /// Application DB context
        /// </summary>
        protected ApplicationDbContext db  = new ApplicationDbContext();

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question