2015-07-04 4 views
1

Я пытаюсь изучить структуру сущности и связанные с ней шаблоны. Во время поиска я наткнулся на сайт: http://www.asp.net/mvc...Entity Framework Единица времени работы

Я проверил образцы, но я не мог понять одну точку. Согласно моим исследованиям, время жизни dbcontex должно быть очень незначительным, поскольку оно имеет объектную модель в памяти, и эти изменения должны быть сохранены в базе данных как можно быстрее. Если нет, будут конфликты в многопользовательских сценариях.

Когда я смотрю на приведенный выше учебник, я вижу, что для каждого контроллера существует только один uow. Интересно, это означает, что пока я на одной странице сайта, выполняющей операции CRUD, я использую тот же dbcontext. Но не должна ли его жизнь короче? Например, для каждого действия может быть определено значение uow.

Может ли кто-нибудь объяснить срок службы uow?

ответ

2

Определение переменной DbContext как частной переменной класса, определяющей ее как локальную переменную, не должно иметь значения.

Каждый раз, когда создается HTTP-запрос, инициализируется контроллер (а также любые его переменные класса) и вызывается действие. Экземпляры ontrollers не будут сохраняться между различными запросами, а также не будут экземпляры DbContext.

Отметьте эту статью о why you don't have to worry about the lifetime of a DbContext.

EDIT

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

Вышеприведенное утверждение верно, если каждое действие использует ваш DbContext. Однако, если использовать только некоторые из ваших действий, вам может быть лучше использовать локальную область DbContext. Это предотвратит ненужное создание переменной класса DbContext при каждом вызове действия, которое не требует его использования. Это сделает ваш код более эффективным? Да, но это так незначительно, и вам придется создавать экземпляр DbContext каждый раз, когда вы хотите его использовать, что приведет к тому, что будет немного мессирским кодом, чем просто иметь одну переменную класса вверху.

+0

спасибо, так что если я создаю клиент-wcf-сервис-сервер? За один запрос службы я должен создать один dbcontext. Я не ошибаюсь? –

+0

Правильный - определение одного частного 'DbContext' в верхней части вашего контроллера и определение его в каждом действии действительно не имеет значения. Тем не менее, первый - это, безусловно, более чистый код. – johnnyRose

2

Каждое вызванное действие - это новый экземпляр контроллера. Просто установите точку останова в своем конструкторе контроллера, и вы увидите, что он вызывается каждый раз, когда вы делаете запрос на любое действие на контроллере.

Как правило, DBC-контекст имеет область действия для каждого веб-запроса в веб-приложении. Поэтому, если вы введете DBContext в свой контроллер, который, как правило, даст вам то, что вам нужно.

+0

спасибо, так что если я создаю клиент-wcf-сервис-сервер? За один запрос службы я должен создать один dbcontext. Я не ошибаюсь? –

+0

Правильно - один dbcontext. Всегда старайтесь поддерживать контекст БД как можно короче, но насколько это уместно. Он будет управлять транзакцией - как правило, каждое из моих действий представляет собой команду, и либо я хочу, чтобы все в этой команде было успешным, или все, чтобы сбой. Я обертываю фильтр вокруг своих действий, которые фиксируют мою единицу работы в конце действия, предполагая, что ошибок нет. – GraemeMiller

1

В приведенном примере контроллер берет на себя ответственность за создание экземпляра DbContext и выполнение распоряжения. Лучшая практика заключается в том, чтобы позволить контейнеру IoC взять на себя ответственность за управление жизненным циклом для экземпляра DbContext и реализовать инъекцию конструктора для вставки DbContext в контроллер MVC/WebApi.

Что касается WCF службы, мое предпочтение, чтобы указать ниже атрибута [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] для службы, а также указать срок службы DbContext так, что только один экземпляр DbContext будет создавать за звонок.

Возможно, вам потребуется некоторое управление жизненным циклом, если DI будет реализован для службы WCF или MVC/WebApi. Ref: https://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx#_Lifetime_Management

Это сообщение также настоятельно рекомендуется для вашего вопроса. One DbContext per web request... why?

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