Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate:如何用一对多关系表示多对多关系?_Nhibernate - Fatal编程技术网

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

Nhibernate:如何用一对多关系表示多对多关系?,nhibernate,Nhibernate,我在互联网上读到一篇文章(我再也找不到那篇文章供我参考了),说多对多的关系可以被一对多的关系所取代。有人能举个例子吗?我刚想到这个问题,意识到没有答案。很遗憾,我经常指出NHibernate文档声明: 不要使用外来关联映射。 真正多对多关联的好用例很少。大部分 您需要存储在“链接表”中的附加信息的时间。 在这种情况下,最好使用两个一对多关联来 中间链接类。事实上,我们认为大多数协会 是一对多和多对一,使用任何 另一种联想方式,问问自己这是否真的必要 请看下面的示例。Extract,是作者和作品之

我在互联网上读到一篇文章(我再也找不到那篇文章供我参考了),说多对多的关系可以被一对多的关系所取代。有人能举个例子吗?

我刚想到这个问题,意识到没有答案。很遗憾,我经常指出NHibernate文档声明:

不要使用外来关联映射。

真正多对多关联的好用例很少。大部分 您需要存储在“链接表”中的附加信息的时间。 在这种情况下,最好使用两个一对多关联来 中间链接类。事实上,我们认为大多数协会 是一对多和多对一,使用任何 另一种联想方式,问问自己这是否真的必要

请看下面的示例。Extract,是
作者
作品
之间多对多关系的简化版本:

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


注意:在文件消费中,我们必须同意这一建议。要求越多,我们就越高兴,因为我们确实找到了处理关系的方法

请描述您的表以及要使用的类。由于关系型DBMS通常不支持多对多关系,因此这些关系使用链接表和两个一对多关系表示。例如,
用户
s和
角色
s之间的多对多关系表示为
用户一对多用户角色多对一角色
。NHibernate通常隐藏这一点,并允许多对多关系商店透明。如果愿意,您可以选择显式映射链接表,即映射
用户
角色
用户角色
,其中
用户角色
包含两个多对一关系(分别映射到
用户
角色
)。在这种情况下,
User
Role
都不需要保存
UserRoles
实例的集合(一对多)(或者至少可以是相反的)。这对于减少内存占用非常有用,因为您需要将更少的集合加载到内存中。缺点是查询变得更加复杂。@cremor我问这个问题纯粹是出于好奇。我目前对一组表没有问题/classes@Andrew洛克:谢谢你的解释。您能否提供一个包含示例代码的网页链接以补充您的解释?请注意,最佳实践链接已移至:
<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" />
<set name="Authors" lazy="true"
  order-by="OrderBy">
  <key column="work_id" not-null="true"/>
  <one-to-many class="AuthorWork" />
</set>