【问题标题】:Is it possible to delete a collection of root entities with all their children using NHibernate是否可以使用 NHibernate 删除根实体及其所有子实体的集合
【发布时间】:2013-05-28 11:44:39
【问题描述】:

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

我不能使用 WHERE Id IN (1, 2, 3) 类型的子句,因为我要删除带有子项的根实体。

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

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

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

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

【问题讨论】:

  • NHibernate 应该如何知道哪些是孙子而不会将子代加载到内存中? NHibernate 还支持也用于审计的钩子,如果某些删除将采用不同的代码路径,它将使它们无用。最简单的方法是使用您想要的删除运行自定义 sql

标签: nhibernate cascading-deletes


【解决方案1】:

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

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

结束更新

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

例如(注意删除时属性)

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

注意

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

【讨论】:

  • 这是我们现在选择的道路。
【解决方案2】:

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

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

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

【讨论】:

  • 我的印象是它不会删除整个地图,给我一个外键约束错误。
  • 你试过添加 cascade="save-update,delete" 吗?那应该摆脱链接的实体..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多