【问题标题】:many-to-many with extra columns nhibernate多对多与额外的列 nhibernate
【发布时间】:2014-04-29 01:48:46
【问题描述】:

所以我有两张表UsersGroups。这些表(在数据库中)被 UGlink 链接表所喜欢。现在除了主外键之外,链接表有一个额外的列:Date

据我了解,这意味着我必须有两个多对一,链接“在中间”。

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

thisUser.Groups

获取组,而不是:

thisUser.UGlinks.Group

【问题讨论】:

  • “但是,由于我对额外的列值几乎从不感兴趣”,要么你需要考虑它,要么你不需要,它是什么?跨度>
  • 我有时会需要它。然后你会同意 Radims 的回答吗? @马修

标签: c# nhibernate


【解决方案1】:

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

<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。与配对对象的多对一是(我会说)更好的解决方案,因为它支持按组搜索用户,反之亦然。

Chapter 24. Best Practices,引用:

不要使用奇异的关联映射。

真正多对多关联的良好用例很少见。大多数时候,您需要存储在“链接表”中的附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联方式时您应该小心,并问问自己是否真的有必要。

这里有一些更详细的解释如何在没有多对多的情况下做到这一点:Nhibernate: How to represent Many-To-Many relationships with One-to-Many relationships?

【讨论】:

  • 我不同意“很少有真正的多对多关联的好用例”的指导。它们在将实体链接到值或查找对象时经常出现。
  • 我的经验不同——将配对表映射为实体只会带来优势。大多数情况下,您可以将配对对象用于子查询,并在过滤Groups 时搜索Users。事实上,当避免many-to-many 时,映射的数量是如此之少......但是/最后的好处是无价的......这只是我的经验,无论如何
  • 提示最佳实践链接已移动:nhibernate.info/doc/nh/en/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2012-10-31
  • 2016-05-11
  • 1970-01-01
  • 2014-09-30
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多