NHibernate如何实施变更跟踪?

NHibernate如何实施变更跟踪?,nhibernate,Nhibernate,nhibernate代理是否做了任何聪明的工作来提高变更跟踪的效率?或者它只支持实体框架所称的基于快照的更改跟踪吗?NHibernate和EntityFramework以非常不同的方式跟踪更改。实体框架跟踪实体本身的更改。NHibernate跟踪会话中的更改 跟踪实体中的更改需要更多内存(因为存储的是before值和after值)。即使从ObjectContext断开连接,实体也可以保留更改跟踪 跟踪会话中的更改总体上效率更高,但如果您断开实体与会话的连接,则会丢失更改跟踪。它是基于快照的 加载

nhibernate代理是否做了任何聪明的工作来提高变更跟踪的效率?或者它只支持实体框架所称的基于快照的更改跟踪吗?

NHibernate和EntityFramework以非常不同的方式跟踪更改。实体框架跟踪实体本身的更改。NHibernate跟踪会话中的更改

跟踪实体中的更改需要更多内存(因为存储的是before值和after值)。即使从ObjectContext断开连接,实体也可以保留更改跟踪

跟踪会话中的更改总体上效率更高,但如果您断开实体与会话的连接,则会丢失更改跟踪。

它是基于快照的

加载实体时,其状态作为对象[]存储在会话中

刷新时,当前状态将转换为对象[],并与原始状态进行比较,以确定哪些属性是脏的


由于许多原因,这更有效。其中之一是,您不需要代理来跟踪更改。另一个问题是,如果您将属性设置为不同的值,然后将其还原,则实体将被视为不脏,从而避免不必要的DB调用。

您是说记录更改的审计日志记录吗,或者完全更改管理,能够恢复到实体的早期版本?如果实体有多个属性,ORM应该向数据库发出update语句,只更改属性。在LINQ TO SQL中,它通过inotifyporpertychange/changed接口知道属性是否已更改(虽然这不是一项要求,但在这种情况下,它会返回到基于快照的更改跟踪,即它会比较每个属性以找出哪些属性已更改)。此语句正确吗?据我所知,EF使用所谓的更改跟踪程序来跟踪实体更改。实体中不包含更改跟踪基础结构。为什么NHibernate不支持仅更新修改的字段?如果快照已经存储,它可以轻松识别修改的字段,并且应该只更新这些字段。依我看,它总是更新所有字段。你能解释一下吗?@AmitJoshi它确实支持它;这不是默认的行为。您需要在实体映射中设置
dynamic update=“true”
。这不是默认行为的原因是什么?实际上,通过在默认情况下更新特定字段,将生成更高效的查询。是因为当
动态更新
真的
时跟踪每个属性的成本更高吗?@AmitJoshi它并不总是更高效,因为每次更改都必须生成
更新
语句,而不是在应用生命周期中生成一次。此外,您可能希望您的更改覆盖整个对象,而不是将您的更改与其他人的更改混合。通常,默认行为更容易预测,但您可以更改它。