【问题标题】:Nhibernate: How to represent Many-To-Many relationships with One-to-Many relationships?Nhibernate:如何用一对多关系表示多对多关系?
【发布时间】:2013-03-08 19:00:23
【问题描述】:

我在互联网上阅读了一篇帖子(我再也找不到该帖子供我参考),多对多关系可以替换为一对多关系。有人可以举个例子吗?

【问题讨论】:

  • 请描述您的表格以及您要使用的类。
  • 由于关系 DBMS 通常不支持多对多关系,因此这些关系使用链接表和两个一对多关系来表示。例如,Users 和Roles 之间的多对多关系表示为User one-to-many UserRoles many-to-one Role。 NHibernate 通常隐藏这一点并透明地允许多对多关系商店。如果需要,您始终可以选择显式映射链接表,即。您将映射UserRole UserRoles,其中UserRoles 包含两个多对一关系(分别为UserRole)。
  • (续)。在这种情况下,UserRole 都不需要保存 UserRoles 实例的集合(一对多)(或者至少它们可以是反向的)。这对于减少内存占用很有用,因为您需要将更少的集合加载到内存中。缺点是查询变得更加复杂。
  • @cremor 我纯粹是出于好奇才提出我的问题。我目前对一组表/类没有问题
  • @Andrew Loker:感谢您的解释。您能否提供一个网页链接,其中包含补充说明的示例代码?

标签: nhibernate


【解决方案1】:

我刚刚提出这个问题,并意识到缺少任何答案。很遗憾,虽然我经常指出这个 NHibernate 文档声明:24. Best Practices

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

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

看看23.2. Author/Work下的例子。提取,AuthorWork 之间的多对多关系的简化版本:

<class name="Work" table="works" ...>
        <id name="Id" column="id" generator="native" />
        ...
        <set name="Authors" table="author_work" lazy="true">
            <key>
                <column name="work_id" not-null="true"/>
            </key>
            <many-to-many class="Author">
                <column name="author_id" not-null="true"/>
            </many-to-many>
        </set>
</class>

及其多对多目标作者:

<class name="Author" table="authors">
  ...
  <set name="Works" table="author_work" inverse="true" lazy="true">
     <key column="author_id"/>
     <many-to-many class="Work" column="work_id"/>
  </set>
</class>

所以,如果我们想在加载时订购这组作品,我们确实遇到了问题。对表中没有列。但更重要的是,没有办法管理这样的列。

我们可以做的是引入Pair对象:AuthorWork并根据需要扩展Pair表

public class AuthorWork
{

    public virtual Author Author { get; set; }
    public virtual Work Work { get; set; }
    public virtual int OrderBy { get; set; }
}

AuthorWork的映射

<class name="AuthorWork" table="author_work">
    ...
    <many-to-one name="Author" column="author_id" />
    <many-to-one name="Workr"  column="work_id" />
    <property name="OrderBy" />

有了这个,我们可以将多对多映射转换为一对多,例如 Authors 集合:

<set name="Authors" lazy="true"
  order-by="OrderBy">
  <key column="work_id" not-null="true"/>
  <one-to-many class="AuthorWork" />
</set>

我们可以管理实体 AuthorWork,设置 OrderBy 列,从而有效地使用配对表。

注意:必须同意文档中的建议 要求越多,我们就越高兴我们确实有办法管理这种关系!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2012-06-05
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多