我刚刚提出这个问题,并意识到缺少任何答案。很遗憾,虽然我经常指出这个 NHibernate 文档声明:24. Best Practices
不要使用奇异的关联映射。
真正多对多关联的良好用例很少见。大多数
您需要将附加信息存储在“链接表”中的时间。
在这种情况下,最好使用两个一对多的关联来
一个中间链接类。事实上,我们认为大多数协会
是一对多和多对一的,你应该小心使用任何
其他联想风格,问问自己是否真的有必要。
看看23.2. Author/Work下的例子。提取,Author 和 Work 之间的多对多关系的简化版本:
<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 列,从而有效地使用配对表。
注意:必须同意文档中的建议 要求越多,我们就越高兴我们确实有办法管理这种关系!