Мой репозиторий работает в модели 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);