我正在使用NHIBERNATE使用VB开发ASP.NET来映射预先存在的数据库(SQL Server 2005)的表。我与实体之间存在多对多关系,我这样映射:
<list name="PropName" table="TableHoldingRelation" lazy="false" >
<key column="idEntity1"></key>
<index column ="orderingColumn" ></index>
<many-to-many class="Entity2" column="idEntity2"></many-to-many>
</list>
映射完美无缺,列表(Entity2)按所选列排序。
问题是此列不连续,因为可能缺少某些值(即:0,1,3,8)。 NHibernate将这些空格保留为null / nothing元素。我希望列表“压缩”,只包含按该列排序的现有元素。
我可以在不更新数据库的情况下实现这一目标吗? (更新不是一个好的解决方案,因为将来某些元素可能会被删除)
提前感谢您的帮助。
编辑:问题中的更多信息。 在这种情况下,表/实体引用Menus和MenuItems。我正在使用的应用程序是一个非常复杂的网站,有很多不同的角色。每个角色都有自己独特的菜单配置,以及独特的项目。甚至有单一用户具有独特的设置。我的任务是重写.NET clases和映射,因为它们非常混乱,而其他与此问题无关的事情。所以我映射的数据库设计是(对于这个问题,显然还有其他表): 一个表格包含菜单及其属性(就像它们对应的角色一样) 一个表包含menuitems及其属性(如他们指向的链接) 一个表格中包含de relation menu-menuitem和一个“position”/ order列。
以防万一需要更多地了解这个问题。
答案 0 :(得分:2)
你可以在这里阅读NHibernate Mapping - <list/>
- Ayende,这种行为是设计的。评论摘录(接近您的问题):
...因为一般来说,让NH为你做这样的事情就可以了 坏。有价值的意思。
但从广义上讲,这是因为它不是NHibernate的责任 这样做。如果你想要这样的东西,你就不需要一份清单 需要一套有序的......
有了这个,我们可以尝试更改您的映射(请参阅order-by
属性):
<bag name="PropName" table="TableHoldingRelation"
order-by="orderingColumn"
lazy="false" >
<key column="idEntity1"></key>
<many-to-many class="Entity2" column="idEntity2"></many-to-many>
</bag>
但是,此映射不允许您插入该列orderingColumn
。
此文档24. Best Practices说:
不要使用异国情调的关联映射。
真正的多对多关联的良好用例很少见。大多数 您需要存储在&#34;链接表&#34;中的其他信息的时间。 在这种情况下,使用两个一对多关联要好得多 中间链接类。事实上,我们认为大多数协会 是一对多和多对一,你在使用任何时都要小心 其他协会风格,并问自己是否真的有必要。
所以,也许介绍一下中间配对对象,将OrderBy属性的管理放在那里,并使用排序列表..