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

我已经在互联网上看过一篇文章(我再也找不到这个post让我反感)多对多的关系可以用一对多的关系来取代。 有人可以提供一个例子吗?

我刚刚提出这个问题,并意识到,没有任何答案。 这是一个耻辱,而我经常指出这个NHibernate的文档声明: 24.最佳实践

不要使用外来的关联映射。

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

看看23.2下的例子。 作者/作品 。 摘录, 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> 

所以,如果我们想订购一套有效的作品,我们确实有一个问题。 对表中没有列。 但更重要的是,如何pipe理这样一个专栏是没有办法的。

我们可以做的是引入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> 

我们可以pipe理实体AuthorWork,设置OrderBy列,因此可以有效地使用配对表。

注意:在文档中必须同意这个build议需求越多,我们就越感到高兴,因为我们有办法pipe理关系!