2010-05-11 60 views
0

這可能非常簡單,但我現在不能看到樹木。nHibernate Self Join Mapping

爲了簡便起見,我想模擬一個字對象,即有相關的話它(同義詞),在這樣做的,所以我可以有以下映射:

<class name="Word" table="bs_word"> 
<id name="Id" column="WordId" type="Int32" unsaved-value="-1"> 
    <generator class="native"> 
    <param name="sequence"></param> 
    </generator> 
</id> 

<property name="Key" column="word" type="String" length="50" /> 
<many-to-one name="SynonymGroup" class="BS.Core.Domain.Synonym, BS.Core" column="SynonymId" lazy="false"/> 


<class name="Synonym" table="bs_Synonym"> 
<id name="Id" column="SynonymId" type="Int32" unsaved-value="-1"> 
    <generator class="native"> 
    <param name="sequence"></param> 
    </generator> 
</id> 
<property name="Alias" column="Alias" type="String" length="50" /> 
<bag name="Words" cascade="none" lazy="false" inverse="true"> 
    <key column="SynonymId" /> 
    <one-to-many class="Word" /> 
</bag> 

映射像這樣將意味着一個給定的話,我可以這樣訪問相關的詞(同義詞):

word.SynonymGroup.Words

不過,我想知道是否有可能映射對象的包放在一個字的實例對象...如果這是有道理的,所以我可以訪問相關的單詞就像這樣:

word.Words

我已經試過與地圖元素玩耍,和複合元素,都無濟於事 - 所以我在想,如果一些善良的人可以在正確的方向指向我?

TA, kmoo01

回答

1

這將映射實體詞的集合(別名):

<class name="Word"> 
    <id ...> 
    <generator .../> 
    </id> 
    <set name="Synonyms" cascade="all"> 
    <key /> 
    <many-to-many class="Word" /> 
    </set> 
</class> 

您可以在classset元素定製的表名和列根據需要在keymany-to-many元素中指定名稱。

請注意,我使用set而不是bag,因爲它更符合語義。您可以將其映射到ICollection<Word>Iesi.Collections.Generic.ISet<Word>