NH3.3和附加分离的对象

时间:2012-10-03 00:53:04

标签: .net nhibernate session

在将整个系统从NH1.2升级到NH3.3的过程中。 系统中的一个常见场景(由之前的开发人员)分离了许多对象并将它们存储在Web会话中,然后通过IHttpModule在每个请求中附加它们。

在一个简单的页面加载中,运行NHProf,我注意到现在附加的这些对象导致它们在数据库中被触发,尽管它们没有被更改。

要附加的上一个代码(NH1.2)是:

if (((NHibernate.Impl.SessionImpl)session).IsSaved(obj)
   session.Lock(obj, LockMode.None)

由于IsSaved似乎已被删除,现在代码为:

if (obj != null)
   session.Lock(obj, LockMode.None)

我的理解是LockMode.None不应该导致数据库更新。 一些对象有版本,有些则没有。两者都在更新。

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

想想我会通过类比来解释,看看差异:

var obj = _nhibernateSession.Load<MyObject>(id);
obj.Title = "Some Title";
_nhibernateSession.Transaction.Commit();

var obj = someObjectInMemoryNotInSession as MyObject;
obj.Title = "Some Title";
_nhibernateSession.Update(obj);
_nhibernateSession.Transaction.Commit();

您是否注意到了差异:在第一种情况下,不需要更新,因为obj取自会话,会话将知道它的任何变化,但在第二个示例中,我们需要显式调用Update,因为现在我们的obj与会话脱节了。

现在问你的问题: 声明:

if (((NHibernate.Impl.SessionImpl)session).IsSaved(obj)
   session.Lock(obj, LockMode.None)

在NH1.2中工作得很好,因为这样你就是第一种情况(从会话中加载实体的情况),但现在你使用的是第二种方法:

if (obj != null)
   session.Lock(obj, LockMode.None)

并且它不会从会话加载obj,这就是NHibernate触发数据库更新的原因。

如果你想避免这种情况,只需在if:

之前调用Get()
obj = session.Get(id, LockMode.None);

或简单地说:

obj = session.Get(id);

两者都能为你的案件做好准备。