1

在使用 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 万个孩子,效率会更高。我搜索了许多主题而没有找到正确的答案。我也做了一些测试,但没有成功一个想法?

4

1 回答 1

1

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

19.3. 用于创建、更新和删除的自定义 SQL

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 .. 我们可以...

于 2019-02-25T10:28:16.467 回答