sql-server-2005 - 具有不连续索引列的 Nhibernate 列表映射

标签 sql-server-2005 nhibernate nhibernate-mapping

我正在用 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/

相关文章:

linq - LinqToSQL 和 Linq 一样吗?

c# - 两个表的 Fluent Nhibernate 映射一对多在映射中使用唯一而不是主键

sql-server - 在 SQL Server 2005 中使用“生成脚本”向导时,“DROP 后跟 CREATE”的“脚本行为”选项在哪里?

对数字进行排序并获得输出为 1.1.1,1.1.2,1.1.3 的 SQL 查询

c# - NHibernate:保存 transient 实例时如何更新身份标识?

nhibernate - 如何使用 NHibernate 映射汽车属性私有(private)集?

c# - 使用子集合更新 NHibernate 对象

sql - 表变量行限制?

sql - 数据库中已经有一个名为 '#columntable' 的对象

c# - NHibernate 和 Firebird 的性能问题