将断开连接的对象附加到NHibernate会话;最佳实践?

时间:2010-12-14 21:44:10

标签: c# nhibernate

我的存储库在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);

1 个答案:

答案 0 :(得分:24)

D:以上都不是。通过保持你的UOW太短而有效地禁用延迟加载并且无法实现延迟加载ORM的目的。事实上,您必须将断开连接的对象重新关联为正常操作,这意味着您的工作单元边界是错误的。

合并,更新和锁定都有不同的用途。如果您坚持使用当前的架构,那么Lock可能就是您想要的。

  • 更新 - 关联已更改的对象
  • 锁定 - 关联未更改的对象
  • 合并 - 如果对象存在于 当前会话然后更新 从合并对象的更改, 否则它与Lock
  • 相同