Nhibernate:如何用一对多的关系表示多对多的关系?
我已经在互联网上看过一篇文章(我再也找不到这个post让我反感)多对多的关系可以用一对多的关系来取代。 有人可以提供一个例子吗?
我刚刚提出这个问题,并意识到,没有任何答案。 这是一个耻辱,而我经常指出这个NHibernate的文档声明: 24.最佳实践
不要使用外来的关联映射。
对于真正的多对多协会来说,很好的用例是很less见的。 大多数情况下,您需要存储在“链接表”中的附加信息。 在这种情况下,使用两个一对多关联到一个中间链接类更好。 事实上,我们认为大多数协会是一对多和多对一的,在使用任何其他协会风格时要小心,问问自己是否真的是必要的。
看看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>
而其多对多的目标作者:
<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理关系!
- 我如何让NHibernate只生成SQL而不执行它?
- Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct
- 在相同的解决scheme中引用2个不同版本的log4net
- ADO.NETentity framework与NHibernate
- NHibernate ISession刷新:何时何地使用它,为什么?
- 我如何使用NHibernate QueryOver重新创build这个复杂的SQL查询?
- JSON.NET和nHibernate延迟加载集合
- 决定之间的NHibernate与entity framework?
- 无法加载文件或程序集crdb_adoplus.dll