Nhibernate:如何用一对多关系表示多对多关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nhibernate:如何用一对多关系表示多对多关系?相关的知识,希望对你有一定的参考价值。

我已经在互联网上阅读了一篇帖子(我再也找不到这篇帖子了),多对多关系可以用一对多关系代替。有人能提供一个例子吗?

答案

我只是提出这个问题,并意识到,没有任何答案。这很遗憾,而我经常指出这个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>

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

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

public class AuthorWork
{

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

作者的映射

<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列,从而有效地使用配对表。

注意:必须同意docsumentation中的建议越多的要求,我们越开心,我们就有办法管理这种关系!

以上是关于Nhibernate:如何用一对多关系表示多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate 自动映射:一对多实体,多对多后端?

NHibernate之(12):初探延迟加载机制

总结一下数据库的 一对多多对一对多对多 关系

具有一对多和多对多关系的 JOOQ pojos

在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是啥

Hibernate关联关系配置(一对多一对一和多对多)