我正在研究使用NHibernate的项目。 我不打开会议。当我需要获取或保存对象时,我打开会话,执行我需要的操作然后关闭会话。所以我一直在处理与会话分离的对象。
例如,当我需要从数据库中获取对象时,我打开会话,然后调用session.Get()并关闭会话。然后我更新了分离对象的一些属性。当我需要保存对数据库的更改时,我调用打开会话的方法,调用session.Update(myObject)并关闭会话。
但是当我这样做时,NHibernate生成的sql会更新我映射的所有字段,即使它们没有改变。我的建议是当对象与会话分离时,NHibernate无法跟踪已经进行的更改。 当您只想更新已从会话中分离的对象的已更改属性时,您使用什么方法?如何跟踪分离对象的更改?
由于
答案 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)