2011-02-03 11 views
0

NHibernateのいくつかの例では、抽象基本エンティティクラスが使用されていますが、これは一時オブジェクト、プロキシオブジェクトを処理するためにEquals、GetHashCodeをオーバーライドしています(レイジーローディングシナリオでは..) 。NHibernateと抽象エンティティの基底クラスの作成

すべてのエンティティを派生させるために抽象基本エンティティクラスを実装することは本当に必要ですか?

答えて

1

遅延ロードを実行する場合は、Equalsをオーバーライドする必要があります。 これは、NHibernateがEqualsメソッドを使用して等しいかどうかを判断するためです。デフォルトは参照平等です。

NHibernateは遅延ロードを実装するとき、実際のエンティティクラスのサブクラスであるプロキシオブジェクトを使用します。すべてのメンバーが遅延ロードを可能にするためにオーバーライドされます。

したがって、プロキシオブジェクトが実際のインスタンスとなるオブジェクトと同じであることをアプリケーションが認識するためには、プロキシオブジェクトをまったく意識するべきではありません。

Equals演算子をオーバーライドして、等価性を知っておく必要があります。

+0

私は、GetHashCodeをオーバーライドした後、ISetのRemove()メソッドで問題が発生しています。この投稿をご覧ください:http://stackoverflow.com/questions/5040043/nhibernate-iesi-iset-fails-to-remove –

2

全く必要ありません。あなたはイドのようなものを置くことができるので、物事が楽になります。同様に、以前のEquals/GetHashCodeのような共通の機能

2

うん、基底クラス自体は必須ではありませんが、等しく、GetHashCodeメソッドをオーバーライドすると、すべてのあなたのエンティティにしたいと思うだろうものですので、基底クラスは、私の経験でそのはるかに少ないrepetetive

2

ますIdプロパティを公開する基本クラスを持つことは、それを利用するジェネリックリポジトリメソッドを作成することや、自動マッピング規約には本当に便利です。

しかし、Equalsをオーバーライドすることは別の話です。

これを実行すると、初期化されていないプロキシを比較するときに(たとえば、シーケンスでDistinctを呼び出して)読み込みが強制されます。そのため、キャッシュされる可能性のある、まれに変化するエンティティのクラス階層に対してのみ行うのが良い方法です。

+0

ここで私はdiegoに同意する必要があります、私はId抽象的なクラスを私のIDフィールドのためだけに使用します。 – Rippo

+0

Equals、GetHashCodeをオーバーライドした後、ISetのRemove()メソッドで問題が発生します。この投稿を参照してください:http://stackoverflow.com/questions/5040043/nhibernate-iesi-isets-fails-to-remove –

関連する問題