nhibernate代理是否可以执行任何智能工作以使更改跟踪更有效?或者它是否仅支持实体框架基于快照的更改跟踪?
答案 0 :(得分:12)
它是基于快照的。
加载实体时,其状态作为对象[]存储在会话中。
当刷新时,当前状态将转换为对象[]并与原始状态进行比较,以确定哪些属性是脏的。
出于多种原因,效率更高。其中之一是您不需要代理来跟踪更改。另一个是,如果将属性设置为不同的值然后将其还原,则该实体将被视为非脏,从而避免不必要的数据库调用。
答案 1 :(得分:9)
NHibernate和EntityFramework以非常不同的方式跟踪变化。实体框架跟踪实体本身的变化。 NHibernate跟踪会话中的变化。
跟踪实体中的更改需要更多内存(因为您要存储之前的值以及之后的值)。即使在断开与ObjectContext的连接后,实体也可以保留更改跟踪。
总体而言,跟踪会话中的更改效率更高,但如果您断开实体与会话的连接,则会丢失更改跟踪。