2011-02-03 92 views
0

我在一些NHibernate示例中看到使用了抽象基類實體類,它重寫了Equals,GetHashCode來處理瞬態實體,代理對象(在延遲加載場景中..我想) 。NHibernate和製作抽象實體基類

真的有必要實現這樣一個抽象基類實體來派生我所有的實體嗎?

回答

1

如果要執行延遲加載,則必須定義重寫等式。 這是因爲NHibernate依賴於Equals方法來確定相等性。默認值是引用相等。

當NHibernate實現延遲加載時,它使用代理對象,這是實體類的子類,每個成員都被覆蓋以啓用延遲加載。

因此,爲了讓您的應用程序識別代理對象與對象相同,它應該是真實的實例 - 它根本不應該知道代理對象。

因此,您必須重寫Equals運算符以智能地識別相等(如果檢查引用相等...等),如果對象的ID相等,則對象相等。

2

根本不需要。它讓事情變得更容易,因爲你可以在其上放置Id等內容。像你之前提到的像Equals/GetHashCode一樣的通用功能。

2

呀,基類本身是不需要的,但壓倒一切的Equals和GetHashCode是你要在所有的實體做一些事情,所以基類可以說少了很多的repetetive

2

根據我的經驗,具有公開Id屬性的基類對於能夠創建利用該屬性的通用存儲庫方法或自動映射約定非常有用。

但是,壓倒一切的等於是另一回事。

這樣做會在您比較它們時強制加載未初始化的代理(例如,通過對序列調用Distinct)。出於這個原因,最好只對可能被緩存的很少更改的實體的類層次結構進行處理。

+0

我不得不同意迭戈這裏,我只使用一個基本的抽象類爲我的Id字段。 – Rippo 2011-02-04 05:36:58

+0

我在重寫Equals,GetHashCode後遇到了ISet的Remove()方法中的麻煩。請看這篇文章:http://stackoverflow.com/questions/5040043/nhibernate-iesi-iset-fails-to-remove – 2011-02-21 22:08:53