2012-01-04 14 views
2

私のドメインモデルは、データベース内の複合キーを持っている場合は等号を上書きするために忘れたときに、私は例外を取得します/ GetHashCodeメソッドNHibernateは、非複合IDとGetHashCodeメソッド

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

なぜそれは私に同じエラーを与えるものではありません私に複合IDがないのですか?

答えて

2

NHibernateは内部状態追跡エンジンでクラスの主キー値を使用してそのインスタンスを識別します。

ドメイン内に1つのプライマリキープロパティがある場合、NHibernateはプロパティで返された値をキー値として使用し、値にGetHashcodeEqualsを呼び出し、プライマリキーを使用してDictionary<TKey,TValue>インスタンス。

コンポジットキーを構成する複数のプライマリキープロパティがある場合、NHibernateは使用できるキー値を取得するための簡単な方法はありません。 2つのインスタンスの均等性を判断する方法を定義する必要があります。具体的には、HashSet<T>のように、インスタンスを効率的に独自のキーに変更する必要があります。

複合キー値を使用するタイプにEqualsGetHashCodeをオーバーライドしていない場合は、データ・モデルで使用される「等価」を反映しません(2つの行が同じ主キーを持つ場合、 Hibernateは正しいエンティティを追跡しているとは確信できません。これが例外が発生する理由です。

コンポジットキーの概要とその対処方法については、hereを参照してください。

+0

です。 NHはマッピングを使用して単一の主キーのプロパティを検索し、これにハッシュコードを取得します。シンプルな型であり、よく定義されたハッシュコードを持っているので、これはOKです。しかし、コンポジット・キーでも同じことをすることはできませんか、または「計算された」ハッシュ・コードが弱すぎるでしょうか? – Stig

+0

.. NHは、単一の主キーとEquals/GetHashCodeをオーバーライドしていない場合、HashSet をどのように使用できますか? – Stig

+0

NHibernateは、単純な主キーを持っているときには、そのキーがプライマリキー値である場合には、「Dictionary」を使用し、使用される複合キーがある場合には、「HashSet」を使用すると考えられます。 NHibernateが主キー値を含む内部型を作成する可能性はありますが、現在はそうではありません。 –

関連する問題