是否可以使用NHibernate删除根实体及其所有子实体的集合

是否可以使用NHibernate删除根实体及其所有子实体的集合,nhibernate,cascading-deletes,Nhibernate,Cascading Deletes,我的问题是:我有一套ID。这些是根实体集合的ID。现在我想高效地删除所有这些根实体 我无法在(1,2,3)类型的子句中执行WHERE Id,因为我正在删除包含子项的根实体 我想知道是否可以避免检索所有根实体并逐个删除它们。这种方法的问题不在于SELECT,而是有很多单独的DELETE语句 NHibernate是否可以批量执行此操作,包括删除所有子项?额外的复杂性:孩子们可以有自己的孩子 因此,我希望NHibernate首先删除包含IN子句的“最底层”子项(可能是多个1),然后删除包含IN子句的子

我的问题是:我有一套ID。这些是根实体集合的ID。现在我想高效地删除所有这些根实体

我无法在(1,2,3)类型的子句中执行
WHERE Id,因为我正在删除包含子项的根实体

我想知道是否可以避免检索所有根实体并逐个删除它们。这种方法的问题不在于
SELECT
,而是有很多单独的
DELETE
语句

NHibernate是否可以批量执行此操作,包括删除所有子项?额外的复杂性:孩子们可以有自己的孩子

因此,我希望NHibernate首先删除包含IN子句的“最底层”子项(可能是多个1),然后删除包含IN子句的子项,最后删除包含IN子句的根实体

如果这是不可能的,那么使用NHibernate高效删除多个根实体的好方法是什么?

更新 如果您有ID列表(没有正确阅读您的问题),则此选项无效

首先,通过设置adonet.batch\U size,可以批量删除“父项”

结束更新

其次,为了避免读取子级(并为这些子级生成删除),可以通过将on CASCADE delete设置为外键约束,将级联删除设置为发生在db级别

例如(注意删除属性)


注意

  • 这仅适用于反向(双向)关系
  • 需要使用此fk约束更新数据库架构
  • 在包含删除的情况下,不要使用cascade=“all”或类似命令

    • 可能有助于使用会话。是否删除传递ID数组的语句?我相信这将删除与数组中ID匹配的对象的整个地图

      Session.Delete("from MyTable t where t.ID in :IDs", IDs, NHibernate.NHibernateUtil.Guid);
      

      其中IDs在本例中是guid的数组,但可以是任何对象

      NHibernate如何知道哪些是孙子,而不将孩子载入记忆?NHibernate还支持钩子,钩子也用于审计,如果某些删除采用不同的代码路径,那么钩子将变得无用。最简单的方法是使用您想要的删除来运行自定义sql。我感觉它不会删除整个映射,这给了我一个外键约束错误。您是否尝试添加cascade=“save update,delete”?这应该可以消除链接实体。这是我们现在选择的道路。
      Session.Delete("from MyTable t where t.ID in :IDs", IDs, NHibernate.NHibernateUtil.Guid);