2010-10-07 2 views
1

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

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

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

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

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

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

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

+1

возможный дубликат [Как удалить объект с помощью PK в nhibernate?] (http://stackoverflow.com/questions/3063777/how-to-delete-an-object-by-using-pk-in-nhibernate) –

ответ

2

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

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

+0

Я пытался выяснить, когда он вернет объект-прокси. Знаете ли вы, что он возвращает только прокси для классов, которые определены как «ленивые»? – jishi

+0

Я не знаю, но я предполагаю, что он загрузит объект, если отображение содержит любые каскадные настройки. Это приятная функция - вам не нужно беспокоиться об очистке связанных объектов. Я бы жил с таким поведением, если бы не была проблема с производительностью. Загрузка объектов по первичному ключу, как правило, выполняется очень быстро. –

1

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

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

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

Я бы сделал 100% уверенным, хотя это и так. Отбросить все nHibernate дает вам, потому что это не было бы мудрым.

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

1

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

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

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

+0

Это может сработать, но может быть отказано в удалении объекта, не связанного с сеансом. Проблема для меня в том, что не все сущности имеют. В качестве своего первичного ключа мне нужно будет подумать, чтобы узнать, что это такое, а не довольно приемлемое решение. Спасибо за предложение. – jishi

Смежные вопросы