2009-03-03 17 views
5

Bu ilişkinin özellikleri olduğunda, aynı sınıfın diğer örnekleriyle aynı sınıftaki diğer örneklerle nasıl eşlenirsiniz? ?Kendi kendine katılma ilişkileri ek özelliklere sahip olduğunda NHibernate eşleştirmeleri

Ben

PersonID PersonName PersonAge 
---------------------------------- 
     1 Dave Dee    55 
     2 Dozy     52 
     3 Beaky    45 
     4 Mick     55 
     5 Tich     58 

Ben PersonPerson adında bir katılmak tablosu kullanılarak Kişi ve Kişi arasındaki çok-çok ilişki istediğiniz bir tablo Kişiye eşleştirilmiş Kişi adında bir sınıf var:

PersonPersonID PersonID RelatedPersonID RelationshipID 
-------------------------------------------------------- 
       1   1    5    1 
       2   3    4    2 
       3   2    1    3 

istediğim PersonPerson tablosunda aşağıdaki nitelikler:

RelationshipID RelationshipName 
-------------------------------- 
      1 Colleague 
      2 Manager 
      3 Tutor 

This question ve bağlantılı-post by Billy McCafferty, PersonPerson ilişkisinin, PersonalPerson tablosundaki ek sütunlar nedeniyle, normal bir JOIN'den kendi başına bir varlığa yükseltilmesi gerektiğini açıklar. Ancak ne zaman kendi kendine bir araya geleceğini açıklamıyor. Farkı, tüm ilgili insanlar için Dave Dee (ID = 1) için sorarsanız, sadece Tich (ID = 5) almalıyım, ama aynı zamanda Dozy (ID = 2) almalıyım) çünkü Dave Dee de RelatedPersonID sütunundadır.

Şu ana kadarki çözümüm, Kişi sınıfımda iki özelliğe sahip olmak.

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; 
    } 
} 

Ve hbm aşağıdaki vardır:

<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> 

Bu bir önemsememek aksak ve zarafetsiz görünüyor. NHibernate genellikle çoğu günlük problemlere zarif çözümler sunar. Yukarıda bunun mantıklı yolu var mı yoksa daha iyi bir yolu var mı?

cevap

İlgili konular