Nhibernate列表映射与非连续索引列

时间:2013-05-27 11:14:43

标签: sql-server-2005 nhibernate nhibernate-mapping

我正在使用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列。

以防万一需要更多地了解这个问题。

1 个答案:

答案 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属性的管理放在那里,并使用排序列表..