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

Ser*_*lov 25 nhibernate

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

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

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

谢谢

Ste*_*ger 16

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

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

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

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

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


Dmy*_*iak 6

映射中使用dynamic-update ="true" .
另外要更新分离对象,请使用:

Session.SaveOrUpdateCopy(myObject)
Run Code Online (Sandbox Code Playgroud)