20

私は問題があります。次のデータ モデルを想像してください。

[Person] table has: PersonId, Name1  
[Tag] table has:  TagId, TagDescription  
[PersonTag] has: PersonId, TagId, IsActive

[PersonTag]単純な多対多結合テーブルではないため、3 つのエンティティすべてを nHibernate で作成しました (データ モデルにあるのとまったく同じです) 。PersonTagしたがって、次のようなクラスにマップした複合 ID が必要です。

<composite-id name="PersonTagKey" class="PersonTagKey">
  <key-property name="PersonId"></key-property>
  <key-property name="TagId"></key-property>
</composite-id> 

オブジェクト グラフをトラバースして、取得したオブジェクトからPersonとオブジェクトの両方を確認できるようにしたいと考えています。そのため、オブジェクトにそれを行うためのプロパティがあり、次のようにマッピングされています。TagPersonTagPersonTag

<many-to-one name="Person" column="PersonId" lazy="proxy" cascade="none" class="Person"/>
<many-to-one name="Tag" column="TagId" lazy="proxy" cascade="none" class="Tag"/>

PersonTagオブジェクトを作成して保存しようとすると、 「Count=n のこの SqlParameterCollection のインデックス n が無効です」というエラーが表示されます。これは、複合 ID 用に 1 回、多対 1 の関係用に 1 回、プロパティを 2 回PersonIdマップしたためです。TagId多対 1 のオブジェクトをマップしなければ、すべてうまくいきます。

同じ nHibernate エンティティでモデル化された同じ列に基づいて、複合 ID と多対 1 の関係を持つことができる方法はありますか?

4

1 に答える 1

28

ケイ、これが答えです。これに関するドキュメントはほとんどありません:

<composite-id name="PersonTagKey" class="PersonTagKey"> 
  <key-many-to-one name="Person" column="PersonId" lazy="proxy" class="Person">
  <key-many-to-one name="Tag" column="TagId" lazy="proxy" class="Tag"/>
</composite-id>

これにより、多対 1 の関係の逆から構成される複合 ID を作成できます。

いい狩り…

于 2009-02-02T20:50:58.073 に答える