2012-01-04 70 views
2

當我的域模型在數據庫中的複合鍵我會忘記重載Equals當異常/ GetHashCode的NHibernate的,非複合ID和GetHashCode

NHibernate.MappingException: composite-id class must override Equals(): 

爲什麼它不給我,當同樣的錯誤我有一個非複合ID?

回答

2

NHibernate在其內部狀態跟蹤引擎中使用您的類的主鍵值來標識該實例。

當你在你的域中有一個主鍵屬性時,NHibernate將使用該屬性返回的值作爲鍵值,使用主鍵調用GetHashcodeEquals,就像使用主鍵一樣Dictionary<TKey,TValue>實例。

當有多個主鍵屬性組成一個組合鍵時,NHibernate沒有無用的方法來獲得它可以使用的鍵值。它要求您定義如何確定兩個實例之間的相等性,從而有效地將實例轉換爲其自己的密鑰,就像在HashSet<T>中那樣。

如果你還沒有在你的類型使用您的複合鍵值覆蓋EqualsGetHashCode,它不反映在數據模型中使用的「平等」(兩行相等如果他們有相同的主鍵) NHibernate不能確定它正在跟蹤正確的實體;這就是發生異常的原因。

你可以找到組合鍵的概述和更多巧妙處理它們的信息here

+0

我明白了。 NH使用映射爲單個主鍵查找屬性並獲取hascode。這是可以的,因爲它是一個簡單的類型並且有一個明確定義的散列碼。但是它不能'對組合鍵執行相同的操作,或者「計​​算」的哈希碼太弱? – Stig 2012-01-04 15:24:03

+0

..以及NH如何在處理單個主鍵時使用HashSet 並且Equals/GetHashCode沒有被覆蓋? – Stig 2012-01-04 15:26:13

+0

你可以想象當你有一個簡單的主鍵時,NHibernate使用'Dictionary',鍵是主鍵值,當有一個組合鍵時使用'HashSet'。 NHibernate可能會創建一個內部類型來包含主鍵值,但目前它不會。 – 2012-01-04 16:17:44