【问题标题】:How to efficiently delete all but the latest x children of parent entity using NHibernate?如何使用 NHibernate 有效地删除除父实体的最新 x 个子项之外的所有子项?
【发布时间】:2009-10-03 01:37:13
【问题描述】:

如果我没有很好地解释这一点,请原谅我。首先,我将 NHibernate 2.0 与 .NET 3.5 一起使用。基本上,我有一个实体“EntityA”(为简单起见),它有一个或多个 EntityB 类型的子级。每个 EntityB 都有一个数字,表示它是最近创建的。我想删除除 x 个最近的 EntityB 之外的所有内容。这构成了清除操作的一部分。

我正在努力寻找一种有效的方法来执行此操作,问题是 EntityB 实例实际上非常复杂,并且本身可能有数百个子对象。 EntityA 上的 EntityB 列表是延迟加载的,如果可能的话,我最好避免将其加载到内存中。

我尝试将 HQL 查询传递给 Session.Delete。不幸的是,HQL 似乎不支持 top 语句,所以我无法进行子选择来选择哪些不删除。

级联是在 NHibernate 中设置的,而不是在数据库中。我不确定,但我想知道 NHibernate 是否会加载整个对象图,即使删除是通过 HQL 完成的。

任何建议将不胜感激。

[Edit]不幸的是,任何查询都必须是 HQL 而不是 SQL,因为它需要独立于数据库[/Edit]

干杯,

詹姆斯

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    根据我使用 nHibernate 的经验,我认为您不会为此找到一个干净的解决方案。但是,没关系。如果框架提供了可行的替代方案,那么走出框架只是一件坏事。使用参数化的 SQL 语句,确保在代码中清楚地知道你在哪里以及为什么要这样做,这将是一个很好的解决方案。

    编辑:

    我相当确定您可以为此提出一个独立于数据库的 SQL 查询,但无论如何...与其尝试使用顶级语句,不如尝试使用 MAX()(假设 HQL 中有这样的函数)来抓取顶部的项目 id,然后构造一个删除语句,条件是 id 不是 MAX id。

    【讨论】:

      【解决方案2】:

      您应该能够使用 HQL delete Child c where c in (:list) 其中list 是子列表的副本,其中仅包含要删除的元素。 list 可以通过 HQL 查询获得,例如 from Child c where c.Parent = :parent - HQL 查询显然不遵守映射的获取策略(惰性与急切),并且只会在指示急切获取子节点时急切地获取子节点(所以不要放在left join fetch c.SubChildren) - 然后过滤以仅包含要删除的元素。

      【讨论】:

        【解决方案3】:

        如果没有别的,你可以在数据库中设置级联,然后做

        Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();
        

        当您需要直接对数据库执行某些操作时,我总是尝试在数据库和休眠中设置级联、默认值等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多