NHibernate:如何用一对多的关系来表示多到多的关系?

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



慕容708150
浏览 410回答 2
2回答

智慧大石

我只是想问这个问题,然后意识到,没有任何答案。这是一个遗憾,尽管我经常指出NHibernate文档声明:24.最佳做法不要使用外来的关联映射。真正的多到多关联的良好用法是罕见的。大多数情况下,您需要存储在“链接表”中的其他信息。在这种情况下,对中间链接类使用两个一对多的关联要好得多。事实上,我们认为大多数的关联是一对多的和多对一的,在使用任何其他的关联风格时,你应该小心,并问自己是否真的有必要。下面的示例23.2.作者/作品..摘录,简化版本的多到多的关系Author和Work:<class&nbsp;name="Work"&nbsp;table="works"&nbsp;...> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<id&nbsp;name="Id"&nbsp;column="id"&nbsp;generator="native"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<set&nbsp;name="Authors"&nbsp;table="author_work"&nbsp;lazy="true"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<key> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<column&nbsp;name="work_id"&nbsp;not-null="true"/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</key> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<many-to-many&nbsp;class="Author"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<column&nbsp;name="author_id"&nbsp;not-null="true"/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</many-to-many> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</set></class>它的多对多目标作者:<class&nbsp;name="Author"&nbsp;table="authors"> &nbsp;&nbsp;...&nbsp;&nbsp;<set&nbsp;name="Works"&nbsp;table="author_work"&nbsp;inverse="true"&nbsp;lazy="true"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<key&nbsp;column="author_id"/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<many-to-many&nbsp;class="Work"&nbsp;column="work_id"/> &nbsp;&nbsp;</set></class>因此,如果我们想订购这套装货工程,我们确实有一个问题。对表中没有列。但更重要的是,没有办法管理这样的专栏。我们所能做的就是引入对偶对象:AuthorWork并根据需要扩展对表。public&nbsp;class&nbsp;AuthorWork{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;virtual&nbsp;Author&nbsp;Author&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;virtual&nbsp;Work&nbsp;Work&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;virtual&nbsp;int&nbsp;OrderBy&nbsp;{&nbsp;get;&nbsp;set;&nbsp;}}AuthorWork的映射<class&nbsp;name="AuthorWork"&nbsp;table="author_work"> &nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;<many-to-one&nbsp;name="Author"&nbsp;column="author_id"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;<many-to-one&nbsp;name="Workr"&nbsp;&nbsp;column="work_id"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;<property&nbsp;name="OrderBy"&nbsp;/>有了这个,我们可以将多到多的映射转换为一对多的映射,例如作者集合:<set&nbsp;name="Authors"&nbsp;lazy="true" &nbsp;&nbsp;order-by="OrderBy"> &nbsp;&nbsp;<key&nbsp;column="work_id"&nbsp;not-null="true"/> &nbsp;&nbsp;<one-to-many&nbsp;class="AuthorWork"&nbsp;/></set>我们可以管理实体AuthorWork,设置OrderBy列,从而有效地处理配对表。注:必须同意这一建议,在综述中提出的要求越多,我们就越高兴我们有办法来管理这种关系!

aluckdog

由于关系DBMS通常不支持多到多关系,所以这些关系使用一个链接表和两个一对多的关系来表示。例如,多到多之间的关系UserS和Roles表示为User one-to-many UserRoles many-to-one Role..NHibernate通常隐藏这一点,并允许多到多的关系商店透明。如果需要,可以始终选择显式地映射链接表。你会给我地图User,&nbsp;Role&nbsp;和&nbsp;UserRoles,在哪里UserRoles包含两个多对一的关系(到User和一个Role分别)在这种情况下User也不Role的收藏(一对多)UserRoles实例(或者至少它们可以是反向的)。这对于减少内存占用非常有用,因为您需要将较少的集合加载到内存中。缺点是查询变得更加复杂。
打开App,查看更多内容
随时随地看视频慕课网APP