Удалить сущность в NHibernate только по первичному ключу - PullRequest
1 голос
/ 07 октября 2010

Я пытаюсь реализовать метод репозитория для удаления сущностей, использующих только первичный ключ, главным образом потому, что из веб-приложения мне обычно известен только первичный ключ при вызове «запроса на удаление» с веб-страницы.

Из-за ORM сегодня существует возможность получить сущность из базы данных, а затем удалить ее, что дает мне дополнительный обход.

Я мог бы использовать удаление HQL, но, поскольку я хочу создать общий метод удаления для всех сущностей, он не будет работать, если я не использую отражение, чтобы выяснить, какое поле является первичным ключом (выполнимо, но не чувствуется правильно).

Или NHibernate в природе нуждается в сущности для правильной обработки каскадов?

Я попробовал этот подход, предполагая, что он не будет загружать объект без явной необходимости, однако у меня еще не было времени его протестировать. Может быть, кто-то может пролить свет на то, как это будет обрабатываться?

var entity = session.Load<T>( primaryKey );
session.Delete( entity );

РЕДАКТИРОВАТЬ: Теперь проверили его, и кажется, что он все еще делает полный выбор на объекте до удаления.

Ответы [ 4 ]

2 голосов
/ 07 октября 2010
2 голосов
/ 07 октября 2010

Load может возвращать прокси-объект, но это не гарантируется.Ваше отображение может содержать каскадные удаления, которые заставят NHibernate загрузить объект из базы данных, чтобы определить, как удалить объект и его график.

Я бы реализовал это, используя Load, как вы делаете.Для некоторых объектов NHibernate, возможно, не нужно делать выбор в первую очередь.В тех случаях, когда это происходит, это [обычно] тривиальная цена, которую вы платите за использование картографа o / r.

1 голос
/ 07 октября 2010

Отказ от ответственности: я не могу проверить это на данный момент.Но не поможет следующее:

Person entity = new Person();
entity.Id = primaryKey;
session.Delete( entity );

Не загружайте сущность, а создавайте вашу сущность, имея только первичный ключ.Я бы с удовольствием проверил это, но сейчас моя среда не работает.

1 голос
/ 07 октября 2010

nHibernate является O (bject) RM.Я согласен с вами, что для разрешения зависимостей ему, вероятно, нужны объекты.

Конечно, вы можете использовать прямые вызовы ADO.Net для удаления ваших объектов.Конечно, это создает свои собственные проблемы, так как вам придется самостоятельно решать любые каскадные проблемы.Если вы пойдете по этому пути, не забудьте исключить из сеанса nHibernate все объекты, которые вы удаляете, используя этот метод.

Но, если это удаление находится в действительно чувствительной части вашей системы, это может бытьпуть.

Я бы на 100% уверен, что это так.Выбрасывать все, что дает nHibernate из-за этого, было бы неразумно.

У меня такое чувство, что ты это знаешь, и ты ищешь строго ответ nHibernate, и я не думаю, что он существует, извините.

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