2

我正在使用 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 元素。我希望列表“压缩”,仅包含现有元素,按该列排序。

我可以在不更新数据库的情况下实现这一点吗?(更新不是一个好的解决方案,因为将来可能会删除某些元素)

在此先感谢您的帮助。

编辑:问题中的更多信息。这种情况下的表/实体指的是菜单和菜单项。我正在使用的应用程序是一个非常复杂的网站,有很多不同的角色。每个角色都有其独特的菜单配置和独特的项目。甚至有具有独特设置的单个用户。我的任务是重写 .NET 类和映射,因为它们真的很乱而且其他与这个问题无关的东西。所以我正在映射的数据库设计是(对于这个问题,显然还有其他表): 一张包含菜单及其属性的表(比如它们对应的角色) 一张包含菜单项及其属性的表(比如它们指向的链接) 一张表,其中包含 de 关系 menu-menuitem 和该菜单内的“位置”/订单列。

以防万一需要对问题有更多的了解。

4

1 回答 1

2

正如您可以在此处阅读的NHibernate 映射-<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说:

不要使用奇异的关联映射。

真正多对多关联的良好用例很少见。大多数时候,您需要存储在“链接表”中的附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联方式时要小心,并问问自己是否真的有必要。

所以,也许引入中间人配对对象,将 OrderBy 属性的管理放在那里,并使用排序列表..

于 2013-05-27T17:36:35.660 回答