0

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

我不能做一种WHERE Id IN (1, 2, 3)子句,因为我正在删除带有孩子的根实体。

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

NHibernate 是否可以批量处理,包括删除所有子项?额外的复杂性:孩子可以有自己的孩子。

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

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

4

2 回答 2

2

更新 这在您有一个 id 列表的情况下无效(没有正确阅读您的问题)。

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

结束更新

其次,为了避免读取子项(并为这些子项生成删除),您可以通过将 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" 或类似的
于 2013-05-28T13:12:06.100 回答
0

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

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

在这种情况下,IDs 是一个 Guid 数组,但可以是任何对象。

于 2013-05-29T00:35:59.307 回答