C# 如何使用NHibernate高效地删除父实体中除最新的x个子实体以外的所有子实体?
如果我解释得不好,请原谅我。首先,我将NHibernate2.0与.NET3.5结合使用。基本上,我有一个实体“EntityA”(为了简单起见),它有一个或多个EntityB类型的子实体。每个EntityB都有一个数字,指示它是如何创建的。我想删除除x之外的所有最新实体B。这是净化操作的一部分 我正在努力寻找一种有效的方法来实现这一点,问题是EntityB实例实际上相当复杂,并且本身可能有数百个子对象。EntityA上的EntityB列表是延迟加载的,如果可能的话,我希望避免将其加载到内存中 我尝试将HQL查询传递给Session.Delete。不幸的是,HQL似乎不支持top语句,因此我无法进行子选择来选择不删除哪些语句 级联设置在NHibernate中,而不是数据库中。我不确定,但我想知道即使删除是通过HQL完成的,NHibernate是否会加载整个对象图 如有任何建议,将不胜感激 [Edit]不幸的是,任何查询都必须是HQL而不是SQL,因为它需要独立于数据库[/Edit] 干杯C# 如何使用NHibernate高效地删除父实体中除最新的x个子实体以外的所有子实体?,c#,nhibernate,C#,Nhibernate,如果我解释得不好,请原谅我。首先,我将NHibernate2.0与.NET3.5结合使用。基本上,我有一个实体“EntityA”(为了简单起见),它有一个或多个EntityB类型的子实体。每个EntityB都有一个数字,指示它是如何创建的。我想删除除x之外的所有最新实体B。这是净化操作的一部分 我正在努力寻找一种有效的方法来实现这一点,问题是EntityB实例实际上相当复杂,并且本身可能有数百个子对象。EntityA上的EntityB列表是延迟加载的,如果可能的话,我希望避免将其加载到内存中 我
詹姆斯根据我与nHibernate的经验,我认为你不会找到一个干净的解决方案。但是,没关系。如果框架提供了可行的替代方案,那么跳出框架只是一件坏事。使用参数化SQL语句,确保在代码中清楚说明执行此操作的位置和原因,这将是一个很好的解决方案 编辑:
我很确定您可以为此提出一个独立于数据库的SQL查询,但无论如何。。。与其尝试使用top语句,不如尝试使用MAX()(假设HQL中有这样一个函数)获取top项id,然后构造一个delete语句,条件是该id不是MAX id。根据我使用nHibernate的经验,我认为您不会找到一个干净的解决方案。但是,没关系。如果框架提供了可行的替代方案,那么跳出框架只是一件坏事。使用参数化SQL语句,确保在代码中清楚说明执行此操作的位置和原因,这将是一个很好的解决方案 编辑:
我很确定您可以为此提出一个独立于数据库的SQL查询,但无论如何。。。与其尝试使用top语句,不如尝试使用MAX()(假设HQL中有这样一个函数)获取top项id,然后构造一个delete语句,条件是该id不是MAX id。如果没有其他方法,您可以在数据库中设置级联,只需执行以下操作
Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();
当您需要直接对数据库执行某些操作时,我总是尝试在数据库和nhibernate中设置级联、默认值等。如果没有其他方法,您可以在数据库中设置级联,然后执行以下操作
Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();
我总是尝试在数据库和nhibernate中设置级联、默认值等,以便在需要直接对数据库执行操作时使用。您应该能够使用HQL
删除子c,其中c在(:list)
其中列表
是仅包含待删除元素的子项列表的副本<代码>列表可以通过HQL查询获得,例如来自子c,其中c.Parent=:Parent
-HQL查询显然不遵守映射的获取策略(懒惰与急切),并且只有在指示急切地获取子对象时才会急切地获取子对象(因此不要将其放入左连接获取c.SubChildren
)-然后过滤以仅包含要删除的元素。您应该能够使用HQL删除子元素c,其中(:list)
中的c是子元素列表的副本,仅包含要删除的元素<代码>列表可以通过HQL查询获得,例如来自子c,其中c.Parent=:Parent
-HQL查询显然不遵守映射的获取策略(懒惰与急切),并且只有在指示急切地获取子对象时才会急切地获取子对象(因此不要将其放入左连接获取c.SubChildren
)-然后过滤以仅包括要删除的元素