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