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

时间:2013-05-28 11:44:40

标签: nhibernate cascading-deletes

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

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

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

NHibernate可以批量处理这个问题,包括删除所有孩子吗?额外的复杂性:孩子可以有自己的孩子。

所以我希望NHibernate首先删除带有IN子句(可能是多个子句)的“最底层”子节点,然后删除具有IN子句的子节点,最后删除具有IN子句的根节点

如果无法做到这一点,那么使用NHibernate有效删除多个根实体的好方法是什么?

2 个答案:

答案 0 :(得分:2)

<强>更新 这在您拥有ID列表的情况下无效(未正确阅读您的问题)。

首先,可以设置批量删除“父母”设置adonet.batch_size,http://nhibernate.info/doc/nh/en/index.html#performance-batch-updates

END UPDATE

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

例如(注意on-delete attr)

<set name="TheCollection" inverse="true" cascade="save-update">
 <key name="theKey" on-delete="cascade"/>
 <one-to-many class="TheType"/>
</set>

请注意

  • 这仅适用于反向(双向)关系。
  • 您的数据库架构需要使用此fk约束进行更新
  • 不要使用cascade =“all”或类似删除的地方

答案 1 :(得分:0)

可以帮助使用Session.Delete语句传递ID数组吗?我相信这将删除与数组中的ID匹配的那些对象的整个地图。

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

其中,ID是本例中的Guids数组,但可以是任何对象。