【问题标题】:Nhibernate list mapping with not continuous index column具有非连续索引列的休眠列表映射
【发布时间】:2013-05-27 11:14:42
【问题描述】:

我正在开发一个带有 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 类和映射,因为它们真的很混乱,而且其他的东西与这个问题无关。所以我正在映射的数据库设计是(对于这个问题,显然还有其他表): 一张包含菜单及其属性的表(例如它们对应的角色) 一张包含菜单项及其属性的表(如它们指向的链接) 一张表,其中包含 de 关系 menu-menuitem 和该菜单内的“位置”/订单列。

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

【问题讨论】:

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


    【解决方案1】:

    您可以在此处阅读 NHibernate Mapping - &lt;list/&gt; - Ayende,此行为是设计使然。 cmets 的摘录(接近您的问题):

    ...因为一般来说,让 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 说:

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

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

    那么,或许可以引入man-in-the middle pairing 对象,把OrderBy 属性的管理放在那里,然后使用排序列表..

    【讨论】:

    • 感谢您的回答。我想我需要在我正在映射的内容中添加更多信息。并不是说您的回答对我没有帮助或不正确,只是为了澄清;)。我会研究那个配对对象,看看它是否满足我的需要。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多