2
當我的域模型在數據庫中的複合鍵我會忘記重載Equals當異常/ GetHashCode的NHibernate的,非複合ID和GetHashCode
NHibernate.MappingException: composite-id class must override Equals():
爲什麼它不給我,當同樣的錯誤我有一個非複合ID?
當我的域模型在數據庫中的複合鍵我會忘記重載Equals當異常/ GetHashCode的NHibernate的,非複合ID和GetHashCode
NHibernate.MappingException: composite-id class must override Equals():
爲什麼它不給我,當同樣的錯誤我有一個非複合ID?
NHibernate在其內部狀態跟蹤引擎中使用您的類的主鍵值來標識該實例。
當你在你的域中有一個主鍵屬性時,NHibernate將使用該屬性返回的值作爲鍵值,使用主鍵調用GetHashcode
和Equals
,就像使用主鍵一樣Dictionary<TKey,TValue>
實例。
當有多個主鍵屬性組成一個組合鍵時,NHibernate沒有無用的方法來獲得它可以使用的鍵值。它要求您定義如何確定兩個實例之間的相等性,從而有效地將實例轉換爲其自己的密鑰,就像在HashSet<T>
中那樣。
如果你還沒有在你的類型使用您的複合鍵值覆蓋Equals
和GetHashCode
,它不反映在數據模型中使用的「平等」(兩行相等如果他們有相同的主鍵) NHibernate不能確定它正在跟蹤正確的實體;這就是發生異常的原因。
你可以找到組合鍵的概述和更多巧妙處理它們的信息here。
我明白了。 NH使用映射爲單個主鍵查找屬性並獲取hascode。這是可以的,因爲它是一個簡單的類型並且有一個明確定義的散列碼。但是它不能'對組合鍵執行相同的操作,或者「計算」的哈希碼太弱? – Stig 2012-01-04 15:24:03
..以及NH如何在處理單個主鍵時使用HashSet並且Equals/GetHashCode沒有被覆蓋? –
Stig
2012-01-04 15:26:13
你可以想象當你有一個簡單的主鍵時,NHibernate使用'Dictionary',鍵是主鍵值,當有一個組合鍵時使用'HashSet'。 NHibernate可能會創建一個內部類型來包含主鍵值,但目前它不會。 – 2012-01-04 16:17:44