Эффективное каскадное удаление Nhibernate - PullRequest
0 голосов
/ 24 февраля 2019

В контексте удаления с помощью nHibernate, при удалении родителя с дочерней коллекцией я хотел бы знать, почему Nhibernate делает построчное удаление для детей (на дочернем ПК)

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

Почему nhibernate может 't do

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

Будет эффективнее, например, если у родителя будет 100 тыс. детей.Я ищу во многих темах, не находя правильного ответа.Я тоже провел несколько тестов, но без успеха Идея?

1 Ответ

0 голосов
/ 25 февраля 2019

Это тот случай, когда мы можем использовать точки расширения NHibernate.Документ

19.3.Пользовательский SQL для создания, обновления и удаления

NHibernate может использовать пользовательские операторы SQL для операций создания, обновления и удаления.Класс и коллекция, сохраняемые в NHibernate, уже содержат набор строк, сгенерированных во время конфигурации (inserttsql, 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 .. мы можем ...

...