Управление временем жизни контекста в хранилище и единицах работы - PullRequest
0 голосов
/ 17 сентября 2011

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

Но часто эти методы служб вызывают друг друга и иногда работают с общими объектами сеанса.Это вызывает проблему отслеживания одной и той же сущности в нескольких контекстах или, более конкретно, -

На объект сущности нельзя ссылаться несколькими экземплярами IEntityChangeTracker.

ребята, продолжайте управлять вашим контекстом:

Что-нибудь подобное - http://www.west -wind.com / weblog / posts / 2008 / Feb / 05 / Linq-to-SQL-DataContext-Lifetime-Management

Или

Я также читал, что люди помещают свой контекст в HttpContext и используют его для http-вызова / для каждого пользователя?

Каков наилучший способ сделать это?

1 Ответ

2 голосов
/ 17 сентября 2011

Общий подход - использование одного контекста на запрос Http. Этот контекст используется всеми вашими службами, потому что если службы в рамках обработки одного запроса вызывают друг друга, они, скорее всего, работают в одной единице работы. Если они не работают в одной единице работы, вам может понадобиться новый контекст для каждой единицы работы.

Вторая проблема с объектами, хранящимися в сеансе, не связана с созданием контекста. Это связано с тем, что вы сохранили прокси-объект в сеансе, не отрывая его от контекста. Чтобы решить эту проблему, вы должны либо:

  • Отключение сущности, хранящейся в сеансе, перед удалением контекста, который использовался для загрузки сущности (или там, где сущность была присоединена во время сохранения). Это можно сделать с помощью context.Entry(entity).State = EntityState.Detached
  • Отключить создание прокси для сущностей, сохраненных в сеансе, с помощью context.Configuration.ProxyCreationEnabled = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...