nhibernate - самый эффективный способ удалить parent-child? - PullRequest
2 голосов
/ 03 июня 2010

Я сопоставил дочерние коллекции с помощью cascade = "all-delete-orphan" и попробовал

var parent = session.Load<Parent>(id);
session.Delete(parent);

Но он также загружает родителя и всех его потомков перед их удалением. Есть ли способ удалить родителя и потомков без их загрузки или хотя бы только загрузить родителя?

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Я не эксперт NHibernate, и я все еще очень много узнаю об этом. Я исправлен, но по умолчанию не выполняет отложенную загрузку NHibernate, то есть Parent.Child будет инициализирован (и загружены данные) только при обращении к нему.

При удалении Родителя реляционная модель, которая создается с помощью all-delete-orphan, означает, что дочерние элементы, связанные с Родителем, должны быть удалены первыми при удалении Родителя. Это может объяснить, почему они загружаются.

Если вы пытаетесь избежать загрузки дочерних элементов по соображениям производительности, возможно, следует реализовать собственный SQL для этого особого случая.

0 голосов
/ 04 июня 2010

Это довольно просто, просто используйте каскадное удаление в базе данных. Если это не вариант, используйте пользовательский запрос, который выполняется на уровне базы данных, или просто используйте этот метод.

NHibernate не может сделать это по запросу, ему нужно извлечь каждую отдельную строку для удаления, так как ему нужны ключи строк для их удаления. Вот что делает это дорогим.

Просто используйте каскадные удаления в базе данных. Это то, в чем база данных хороша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...