这是我的问题:我有一组ID。这些是根实体集合的ID。现在我想有效地删除所有这些根实体。
我无法执行WHERE Id IN (1, 2, 3)
类型的子句,因为我正在删除带子项的根实体。
我想知道是否可以避免检索所有根实体并逐个删除它们。这种方法的问题不在于SELECT
,而是有很多单独的DELETE
语句。
NHibernate可以批量处理这个问题,包括删除所有孩子吗?额外的复杂性:孩子可以有自己的孩子。
所以我希望NHibernate首先删除带有IN子句(可能是多个子句)的“最底层”子节点,然后删除具有IN子句的子节点,最后删除具有IN子句的根节点
如果无法做到这一点,那么使用NHibernate有效删除多个根实体的好方法是什么?
答案 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>
请注意
答案 1 :(得分:0)
可以帮助使用Session.Delete语句传递ID数组吗?我相信这将删除与数组中的ID匹配的那些对象的整个地图。
Session.Delete("from MyTable t where t.ID in :IDs", IDs, NHibernate.NHibernateUtil.Guid);
其中,ID是本例中的Guids数组,但可以是任何对象。