2010-05-11 57 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>