在会话分离时,仅更新NHibernate中已更改属性的最佳方法是什么?

时间:2009-08-07 07:18:40

标签: nhibernate

我正在研究使用NHibernate的项目。 我不打开会议。当我需要获取或保存对象时,我打开会话,执行我需要的操作然后关闭会话。所以我一直在处理与会话分离的对象。

例如,当我需要从数据库中获取对象时,我打开会话,然后调用session.Get()并关闭会话。然后我更新了分离对象的一些属性。当我需要保存对数据库的更改时,我调用打开会话的方法,调用session.Update(myObject)并关闭会话。

但是当我这样做时,NHibernate生成的sql会更新我映射的所有字段,即使它们没有改变。我的建议是当对象与会话分离时,NHibernate无法跟踪已经进行的更改。 当您只想更新已从会话中分离的对象的已更改属性时,您使用什么方法?如何跟踪分离对象的更改?

由于

2 个答案:

答案 0 :(得分:16)

问题是:你为什么要这样做?如果您只更新已更改的列,我认为这不是一个优化。

你有数据库中的触发器吗?

如果是这样,您可以执行以下操作:

  • 在映射中使用select-before-update="true"dynamic-update="true"。这使得NH在更新之前执行查询,并且仅在更改时进行更新,并且仅更新已更改的列。我不确定它是为每次更新选择,还是仅在会话中没有。
  • 使用Merge代替更新。这实际上是相同的:它只从数据库中选择实体,只有它不在会话中。也可以使用dynamic-update="true"。还有一个权衡:Merge如果会话中已有实例,则返回附加的实例。因此,您应该始终丢弃传入的实例,并使用从Merge开始的实例。

实际上我不关心更新的列。最有可能更快地更新它们而不是执行先前的查询。

答案 1 :(得分:6)

mapping中使用dynamic-update =“true” 另外要更新分离的对象,请使用:

Session.SaveOrUpdateCopy(myObject)