DBスキーマをそのままにして、最初にC#ドメインクラスを調整しましょう。
public class Person
{
public virtual string Name {get;set;}
public virtual int Age {get;set;}
public virtual IList<Role> RolesForThisPerson {get;set;}
}
public class Role
{
public virtual string RoleName { get; set; }
}
次に、これら2つのエンティティの定義済みテーブルへの基本的なマッピングを示します。
<class name="Person" table="Person" lazy="true">
<id name="ID" column="personID">
<generator class="native" />
</id>
<property name="Name" not-null="true" />
<property name="Age" not-null="true" />
<!-- placeholder for roles -->
</class>
<class name="Role" table="Role" lazy="true">
<id name="ID" column="roleID">
<generator class="native" />
</id>
<property name="RoleName" not-null="true" />
</class>
これで、マッピングを使用して、クラスマッピングを次のよう<idbag>
に拡張できます。Person
<idbag name="RolesForThisPerson" batch-size="25" table="PersonRoles"
inverse="true" lazy="true" cascade="none" >
<collection-id column="personRolesID" type="System.Int32" >
<generator class="native" />
</collection-id>
<key column="personID" />
<many-to-many class="Role" column="roleID" />
</idbag>
<idbag>
ペアテーブルでさえ独自の識別子を持っているという事実から利益を得ることができます。カスケードはnoneに設定されており、ロールがシステム内にあり、ユーザーはそれらにのみ割り当てられている(から削除されている)ことを想定しています。属性batch-size
は、レイジーロールコレクションをフェッチするときに実行されるSELECTステートメントの数に影響します。