我的存储库在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;
}
}
我还实现了一些包装器方法,允许您指定将在此框架中执行的lambda或委托,从而减轻了每次实现所有脚手架的需要。
我遇到的问题是,使用此模型时,代码必须“知道”用户需要什么,并在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);
答案 0 :(得分:24)
D:以上都不是。通过保持你的UOW太短而有效地禁用延迟加载并且无法实现延迟加载ORM的目的。事实上,您必须将断开连接的对象重新关联为正常操作,这意味着您的工作单元边界是错误的。
合并,更新和锁定都有不同的用途。如果您坚持使用当前的架构,那么Lock可能就是您想要的。