Nhibernate有效的级联删除

时间:2019-02-24 20:20:34

标签: nhibernate sql-delete nhibernate-cascade

在使用nHibernate的删除上下文中,删除带有子集合的父级时 我想知道为什么Nhibernate逐行删除孩子(在孩子PK上)

DELETE FROM children where Id=1
DELETE FROM children where Id=2
...    
DELETE FROM parent where id=1

为什么nhibernate无法做

DELETE FROM children where parentId=1
DELETE FROM parent where id=1

例如,如果父母有10万个孩子,这将更有效率。 我在许多主题中搜索而找不到正确的答案。我也做了一些测试,但是没有成功 一个主意吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我们可以使用NHibernate可扩展性点。文档

19.3. Custom SQL for create, update and delete

  

NHibernate可以使用自定义SQL语句来创建,更新和   删除操作。 NHibernate中的类和集合持久性   已经包含一组配置时间生成的字符串   (insertsql,deletesql,updatesql等)。映射标签<sql-insert>,   <sql-delete><sql-update>覆盖以下字符串:

<class name="Person">
    <id name="id">
        <generator class="increment"/>
    </id>
    <property name="name" not-null="true"/>
    <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
    <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
    <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>

因此,如果标准删除没有用,我们可以提供我们自己的过程,包括一些存储过程

<sql-delete>exec deletePerson ?</sql-delete>

总而言之,在大多数情况下,标准模型已经足够有效且有效。如果我们需要改进SQL ..我们可以...