我正在用 VB 开发 ASP.NET,使用 NHIBERNATE 来映射预先存在的数据库 (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 类和映射,因为它们确实很困惑,而且其他内容与这个问题无关。所以我映射的数据库设计是(对于这个问题,显然还有其他表): 一张 table 包含菜单及其属性(例如它们对应的角色) 一张表保存菜单项及其属性(如它们指向的链接) 一张表保存菜单-菜单项之间的关系以及该菜单内的“位置”/顺序列。
以防万一需要对问题有更多了解。
最佳答案
正如您可以在此处阅读的那样 NHibernate Mapping -<list/>
- Ayende 表示,此行为是设计使然。评论摘录(接近您的问题):
...Because in general, having NH doing something like that for you can be bad. There is a meaning to null values.
But broadly, it is because it is not the responsibility of NHibernate to do so. If you want something like that, you don't need a list, you need an ordered set...
有了这个,我们可以尝试更改您的映射(请参阅 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说:
不要使用奇异的关联映射。
Good usecases for a real many-to-many associations are rare. Most of the time you need additional information stored in the "link table". In this case, it is much better to use two one-to-many associations to an intermediate link class. In fact, we think that most associations are one-to-many and many-to-one, you should be careful when using any other association style and ask yourself if it is really neccessary.
所以,也许引入中间人配对对象,将 OrderBy 属性的管理放在那里,并使用排序列表..
关于sql-server-2005 - 具有不连续索引列的 Nhibernate 列表映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16771943/