带有额外列的多对多nhibernate

时间:2014-03-21 15:36:03

标签: c# nhibernate

所以我有两个表UsersGroups。这些表(在数据库中)与UGlink链接表一起使用。现在除了主外键之外,链接表还有一个额外的列:Date

根据我的理解,这意味着我必须有两个多对一,链接"在中间"。

但是,由于我几乎从不对额外的列值感兴趣,所以无论如何都要避免链接?那是我希望能写的:

thisUser.Groups

获取组,而不是:

thisUser.UGlinks.Group

enter image description here

1 个答案:

答案 0 :(得分:3)

many-to-many,没有配对表作为实体的显式映射 - 当然是在NHibernate支持。因此,如果 Date 列是自动生成的,或者可以为空的(不必由app / NHiberante插入),我们可以这样做:{{ 3}}

<class name="User">
    <id name="Id" column="Uid"/>
    ...
    <bag name="Groups" table="UGlink" lazy="true">
        <key column="Uid"/>
        <many-to-many class="Group" column="Gid"/>
    </bag>
</class>

<class name="Group">
    <id name="id" column="Gid"/>
    ...

    <!-- inverse end -->
    <bag name="Users" table="UGlink" inverse="true" lazy="true">
        <key column="Gid"/>
        <many-to-many class="User" column="Uid"/>
    </bag>
</class>

所以,我们所拥有的是一个映射,其中NHiberante确实关心配对表,我们可以这样做:

thisUser.Groups

但如果我可以建议,请不要使用many-to-many。与配对对象的多对一是(我会说)更好的解决方案,因为它将支持按组搜索用户,反之亦然。

请参阅6.8. Bidirectional Associations,引用:

  

不要使用异国情调的关联映射。

     

真正的多对多关联的良好用例很少见。大多数情况下,您需要存储在&#34;链接表&#34;中的其他信息。在这种情况下,使用两个一对多关联到中间链接类要好得多。事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要。

以下是一些更详细的解释如何在没有多对多的情况下执行此操作:Chapter 24. Best Practices