Присоединение отключенного объекта к сеансу NHibernate;лучшая практика? - PullRequest
14 голосов
/ 15 декабря 2010

Мой репозиторий работает в модели UnitOfWork; все операции, будь то извлечение или сохранение, должны выполняться в рамках объекта токена IDisposable UnitOfWork, который за кадром связан с Session, который выполняет запрошенную работу. Итак, основной шаблон:

using (var uow = repo.BeginUnitOfWork())
{
   try
   {
      //DB operations here; all repo methods require passing in uow.
      ...
      repo.CommitUnitOfWork(uow);
   }
   catch(Exception)
   {
      repo.RollbackUnitOfWork(uow);
      throw;
   }
}

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

Проблема, с которой я столкнулся, заключается в том, что при использовании этой модели код должен «знать», что нужно пользователю, и загружать его, используя NHUtil.Initialize() в пределах UnitOfWork. Как только UOW располагается в конце блока использования, сеанс, связанный с любым PersistentBags, закрывается, и поэтому они не могут быть оценены. Так как стремительная загрузка всего заранее не всегда выполнима и в некоторой степени побеждает цель ленивой загрузки ORM, я реализую метод Attach().

Вот вопрос; В отсутствие встроенного метода ISession.Attach(), я видел три рекомендованных метода для привязки объекта к новому сеансу. Какой из них является наилучшей практикой для выполнения работы?

A:

if(!Session.Contains(domainObject))
    Session.Update(domainObject);

B:

Session.Merge(domainObject);

C

Session.Lock(domainObject, LockMode.None);

1 Ответ

24 голосов
/ 15 декабря 2010

D: ничего из вышеперечисленного.Эффективно отключите ленивую загрузку, сохраняя слишком короткое UOW и побеждая цель ленивой загрузки ORM.Тот факт, что вам необходимо повторно связать отключенные объекты как обычные операции, означает, что границы вашей единицы работы неверны.

Объединение, обновление и блокировка имеют разные цели.Если вы застряли в своей текущей архитектуре, тогда Lock - это то, что вам нужно.

  • Update - связывает измененный объект
  • Lock - связывает неизмененный объект
  • Слияние - если объект существует в текущем сеансе, то он обновляется с изменениями из объединенного объекта, в противном случае он аналогичен блокировке
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...