LIfetime управление Dbcontext с использованием Unity с ThreadPool - PullRequest
1 голос
/ 04 января 2012

В настоящее время я создаю приложение ASP.NET MVC с инфраструктурой Unity и Entity.Я использую настройку Unity MVC 3, где он использует ContainerControlledLifetimeManager для разрешения зависимости (http://devtrends.co.uk/blog/introducing-the-unity.mvc3-nuget-package-to-reconcile-mvc3-unity-and-idisposable). Это работает нормально, пока я не попытаюсь раскрутить другой поток, который выполняет трудоемкую задачу после загрузки страницы, и пользователь получаетобновлений. Из ветки я получаю эту ошибку:

The operation cannot be completed because the DbContext has been disposed.

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 января 2012

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

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

ИМХО, охватывающий пользовательский поток в приложении ASP.NET (или любом размещенном в IIS) приложении, не очень хорошая идея.

0 голосов
/ 04 января 2012

Чаще всего проблема в том, что в вашем контроллере есть код вроде:

public ActionResult Blah()
{
  MyViewModel model = new MyViewModel();

  using (var dbc = new MyDbContext())
  {
    model.items = from x in dbc.items select x;
  }    

  View(model)
}

items не было разрешено в этом случае, поэтому решение:

    model.items = (from x in dbc.items select x).ToList();
...