Làm thế nào để ánh xạ một lớp đến các phiên bản khác của cùng một lớp khi mối quan hệ đó có các thuộc tính riêng là?Ánh xạ NHibernate khi các mối quan hệ tự tham gia có các thuộc tính bổ sung
Tôi có một lớp được gọi là Người được ánh xạ tới một Person bảng
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
Tôi muốn có một mối quan hệ nhiều-nhiều giữa người và người sử dụng một bảng tham gia gọi PersonPerson:
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
Tôi muốn các thuộc tính sau trong bảng PersonPerson:
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This question và liên kết đến post by Billy McCafferty giải thích rằng mối quan hệ PersonPerson phải được đẩy từ một JOIN bình thường thành một thực thể theo đúng nghĩa của nó vì các cột bổ sung trong bảng PersonPerson. Tuy nhiên nó không giải thích những gì khi nó là một tự tham gia. Sự khác biệt là nếu tôi yêu cầu tất cả những người có liên quan đến số Dave Dee (ID = 1), tôi không chỉ nhận được Tich (ID = 5), nhưng tôi cũng nhận được Dozy (ID = 2) cũng vì Dave Dee cũng nằm trong cột RelatedPersonID.
Giải pháp của tôi cho đến nay, là có hai thuộc tính trong lớp Person của tôi.
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;
}
}
Và có sau trong 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>
Điều này có vẻ là một trifle clunky và thanh nha. NHibernate thường có các giải pháp thanh lịch cho hầu hết các vấn đề hàng ngày. Ở trên là cách hợp lý để làm điều này hoặc là có một cách tốt hơn?
@Frederik Gheysels Câu trả lời hay, tôi sẽ thử ngay bây giờ. Nó có vẻ là một giải pháp rõ ràng bây giờ mà bạn đã nói nó! –
@Frederik - Tôi thích ý tưởng thực hiện điều này trong kho lưu trữ, nhưng nó vẫn chưa rõ ràng với tôi làm thế nào tôi sẽ lấy lại tất cả các trường hợp liên quan và các loại mối quan hệ là tốt. –
Tôi sẽ trả về đối tượng Person có mối quan hệ với người được chỉ định. Offcourse, những đối tượng Person có bộ sưu tập 'PersonPerson' chứa tất cả các mối quan hệ mà Người này có. –