クラスに同じクラスの別のインスタンスをマップする方法その関係自体にプロパティがある場合?自己結合関係に追加のプロパティがある場合のNHibernateマッピング
私はPersonPersonと呼ばれる結合テーブルを使って人と人の間の多対多の関係するテーブルの人
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
にマッピングされている人というクラスがあります。
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
を
PersonPersonテーブルに次の属性が必要です。
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This questionとリンク先のpost by Billy McCaffertyは、PersonPerson関係を、PersonPerson表の追加の列のために、通常のJOINからそれ自体のエンティティーに昇格させる必要があると説明しています。しかし、それは何が自己結合であるかを説明していません。違いは、関連する人々をすべてDave Dee(ID = 1)に尋ねると、Tich(ID = 5)を取得するだけでなく、取得する必要があります。Dozy(ID = 2) )同様に、Dave DeeもRelatedPersonID列にあるためです。
これまでの私の解決策は、Personクラスに2つのプロパティを設定することです。
public virtual IList<PersonPerson> PersonPersonForward {get;set;}
public virtual IList<PersonPerson> PersonPersonBack {get;set;}
private List<PersonPerson> personPersonAll;
public virtual List<PersonPerson> PersonPersonAll
{
get
{
personPersonAll = new List<PersonPerson>(PersonPersonForward);
personPersonAll.AddRange(PersonPersonBack);
return personPersonAll;
}
}
そしてHBMに次のようにあります
<bag name="PersonPersonForward" table="PersonPerson" cascade="all">
<key column="PersonID"/>
<one-to-many class="PersonPerson" />
</bag>
<bag name="PersonPersonBack" table="PersonPerson" cascade="all">
<key column="RelatedPersonID"/>
<one-to-many class="PersonPerson" />
</bag>
これは些細な事不格好と洗練ようです。 NHibernateは、通常、ほとんどの日常的な問題を洗練された方法で解決します。上記は、これを行うための合理的な方法ですか、それとも良い方法がありますか?
@Frederik Gheysels偉大な答えは、私は今それを試してみましょう。あなたがそれを言ったので、明らかな解決策と思われます! –
@Frederik - 私はリポジトリでこれをやっているのが好きですが、関連するすべてのインスタンスと関係タイプも取り戻す方法はまだ分かりません。 –
私は、指定された人との関係を持つPersonオブジェクトを返します。 Offcourse、これらのPersonオブジェクトには、このPersonが持つすべての関係を含む 'PersonPerson'コレクションがあります。 –