当这种关系本身具有属性时,如何将一个类映射到同一类的其他实例?
我有一个名为 Person 的类,它映射到一个表 Person
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
我希望使用名为 PersonPerson 的连接表在 Person 和 Person 之间建立多对多关系:
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
这个问题和Billy McCafferty的链接到帖子解释说,由于 PersonPerson 表中的附加列,必须将 PersonPerson 关系从正常的 JOIN 提升到其自身的实体。但是,它没有解释当它是自加入时要做什么。不同之处在于,如果我要求所有与Dave Dee (ID = 1) 相关的人,我不仅应该得到Tich (ID = 5),而且我也应该得到Dozy (ID = 2),因为 Dave Dee也在 RelatedPersonID 列中。
到目前为止,我的解决方案是在我的 Person 类中有两个属性。
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 通常对大多数日常问题都有优雅的解决方案。以上是明智的做法还是有更好的方法?