Мой репозиторий работает в модели 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()
существует три метода, которые я видел, чтобы связать объект с новым сеансом. Какая из них - лучшая практика для выполнения работы?
А:
if(!Session.Contains(domainObject))
Session.Update(domainObject);
В:
Session.Merge(domainObject);
С
Session.Lock(domainObject, LockMode.None);