我已经在互联网上阅读了一篇帖子(我再也找不到这篇帖子了),多对多关系可以用一对多关系代替.有人能提供一个例子吗?
Rad*_*ler 13
我只是提出这个问题,并意识到,没有任何答案.这很遗憾,而我经常指出这个NHibernate文档声明:24.最佳实践
不要使用异国情调的关联映射.
真正的多对多关联的良好用途很少见.大多数情况下,您需要存储在"链接表"中的其他信息.在这种情况下,使用两个一对多关联到中间链接类要好得多.事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要.
看一下23.2下的例子.作者/工作.提取,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>
Run Code Online (Sandbox Code Playgroud)
它的多对多目标作者:
<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>
Run Code Online (Sandbox Code Playgroud)
所以,如果我们想在加载时订购一组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; }
}
Run Code Online (Sandbox Code Playgroud)
作者的映射
<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" />
Run Code Online (Sandbox Code Playgroud)
有了这个,我们可以将多对多映射转换为一对多,例如Authors集合:
<set name="Authors" lazy="true"
order-by="OrderBy">
<key column="work_id" not-null="true"/>
<one-to-many class="AuthorWork" />
</set>
Run Code Online (Sandbox Code Playgroud)
我们可以管理实体AuthorWork,设置OrderBy列,从而有效地使用配对表.
注意:必须同意docsumentation中的建议越多的要求,我们越开心,我们就有办法管理这种关系!
| 归档时间: |
|
| 查看次数: |
7968 次 |
| 最近记录: |