PK (複合主キー) として 2 つの列を持つテーブルがあります。
それらを「Id」にマップするにはどうすればよいhbm.xml
ですか?
<id name="A" />
流暢なnhibernateでどうすればできますか?
PK (複合主キー) として 2 つの列を持つテーブルがあります。
それらを「Id」にマップするにはどうすればよいhbm.xml
ですか?
<id name="A" />
流暢なnhibernateでどうすればできますか?
NHibernate のドキュメントでは、 composite-idを使用してマップする方法について説明しています。
コンポーネントを compositeid として使用することもできます。
Fluent NHibernate の場合:
public class ClassNameMap: ClassMap<ClassName>
{
public ClassNameMap()
{
CompositeId().
.KeyReference(x => x.A, "A")
.KeyReference(x => x.B, "B");
}
}
nHibernate の複合主キーについては、お勧めします。
hbm.xml の場合:
<hibernate-mapping>
<class table="TableName" name="Namespace.ClassName, ClassName">
<composite-id>
<key-property name="IdPropertyOne" column="ColumnOne" />
<key-property name="IdPropertyTwo" column="ColumnTwo" />
</composite-id>
<property name="PropertyName" column="ColumnName" type="String"></property>
</class>
</hibernate-mapping>
次に、Equals メソッドと GetHashCode メソッドをオーバーライドして、 nHibernate が新しいキーを比較し、異なるオブジェクトを識別する方法を認識できるようにする必要があります。それはあなたがどこまで進んでいるかにもよりますが、「key-many-to-one」を使用してこれらに外部キーをマッピングすることもできます。
鍵多対一の場合:
<key-many-to-one name="PropertyOneObjName" column="ColumnOne" class="PropertyOneClassName">
流暢な休止状態の場合、複合キーは次のようになります。
public ClassName(){
CompositeId().
KeyProperty(x => x.IdPropertyOne,"ColumnOne")
KeyProperty(x => x.IdPropertyTwo,"ColumnTwo")
}
これをNHibernateで試してみてください...
<composite-id name="Key" class="KeyClass">
<key-many-to-one name="first" column="firstColumn" lazy="proxy" class="FirstClass"/>
<key-many-to-one name="second" column="secondColumn" lazy="proxy" class="SecondClass"/>
</composite-id>
流暢な Hibernate の場合
<composite-id>
<key-property type="Int32" name="first" column="firstColumn" />
<key-property type="Int32" name="second" column="secondColumn" />
</composite-id>
お役に立てば幸いです... :-)