2010-05-28 69 views
10

nhibernate代理是否做任何聰明的工作來使更改跟蹤高效?還是它只支持實體框架調用基於快照的變更跟蹤?NHibernate如何實現更改跟蹤?

+0

您是否在談論審計日誌記錄,其中記錄了更改,還是全面變更管理以及恢復到早期版本的實體的能力? – DanK 2010-05-28 08:02:26

+0

如果實體具有多個屬性,則ORM應該僅使用更改的屬性向數據庫發出更新語句。在LINQ TO SQL中,它通過INotifyPorpertyChanging/Changed接口知道屬性是否已更改(儘管它不是必需的,在這種情況下,它會回退到基於快照的更改跟蹤,即它比較每個屬性以找出哪些屬性已更改)。 – Alice 2010-05-28 15:33:12

回答

12

這是基於快照的。

加載實體時,其狀態作爲對象[]存儲在會話中。

當沖洗時,當前狀態轉換爲對象[]並與原始狀態進行比較以確定哪些屬性是髒的。

由於多種原因,這樣更有效率。其中之一是你不需要需要代理來跟蹤更改。另一個原因是,如果您將一個屬性設置爲不同的值並將其恢復,則該實體將被視爲非髒,從而避免不必要的數據庫調用。

9

NHibernate和EntityFramework跟蹤以非常不同的方式進行更改。實體框架跟蹤實體本身的變化。 NHibernate跟蹤會話中的更改。

實體中的跟蹤更改需要更多的內存(因爲您正在存儲之前的值以及之後的值)。即使從ObjectContext斷開連接,實體也可以保留更改跟蹤。

跟蹤會話中的更改總體來說效率更高,但是如果您從會話中斷開實體,則會丟失更改跟蹤。

+0

這句話是正確的嗎?據我所知,EF使用所謂的變化追蹤器來追蹤實體變化。實體中不包含更改跟蹤基礎結構。 – Andreas 2016-02-29 08:03:13