0

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

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

要附加的先前代码(NH1.2)大致如下:

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

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

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

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

任何建议表示赞赏。

4

1 回答 1

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 是从 session 中获取的,并且 session 会知道它的任何更改,但是在第二个示例中,我们需要显式调用 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);

两者都将为您的情况做好工作。

于 2012-10-03T08:45:38.467 回答