所以我有两个表Users
和Groups
。这些表(在数据库中)与UGlink
链接表一起使用。现在除了主外键之外,链接表还有一个额外的列:Date
。
根据我的理解,这意味着我必须有两个多对一,链接"在中间"。
但是,由于我几乎从不对额外的列值感兴趣,所以无论如何都要避免链接?那是我希望能写的:
thisUser.Groups
获取组,而不是:
thisUser.UGlinks.Group
答案 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