2010-03-17 2 views
2

У меня есть объект с отображением Nhibernate, который имеет суррогатный идентификатор и идентификационный номер. Начиная с курса естественный идентификатор однозначно ограничен, запрос на вставку не будет выполнен, если объект уже находится в базе данных с тем же естественным идентификатором. Мое решение для этого состояло в том, чтобы вручную проверить, есть ли в базе данных естественные идентификаторы, прежде чем пытаться вставить.Unique Constraint Nhibernate

Есть ли способ указать Nhibernate для выбора перед вставкой на естественные идентификаторы/уникальные ограничения?

ответ

1

В той или иной форме вам нужно будет обратиться в БД.

Однако вы можете сделать это более прозрачным способом с помощью NH Validator.

Прочитайте следующий пост от Фабио Maulo: http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html

+0

Как валидаторы мне помогают? – Will

+0

Ссылка, опубликованная Diego, является примером использования NH Validator для запроса базы данных, чтобы убедиться, что естественный идентификатор BlogPost (Title и Date) не нарушен. Это будет делать именно то, что вы просили - прежде чем пытаться сохранить объект, NHibernate проверит проверки, что приведет к выполнению запроса выбора. –

0

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

Вам все равно придется ударить по БД, поэтому неудачный INSERT имеет в основном такую ​​же стоимость (если не дешевле), чем SELECT ... И это безопаснее.

+0

Проблема возникает, когда эти объекты являются частью каскадной конструкции. Единственный объект, который мне действительно неинтересен, если он обновляет или вставляет, разбивает транзакцию для всей конструкции. – Will

+0

Вот почему вы должны сделать то и другое! – dariol

0

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

1

Я закончил создание слушателя SaveOrUpdate для Nhibernate, так как объекты должны быть сохранены в базе данных, я могу определить, следует ли проверять их уникальность. Вместо того, чтобы просто выбирать, существуют ли уникальные свойства объекта в базе данных, я делаю выбор для обновления (пессимистическая блокировка), поэтому строка будет заблокирована, чтобы я мог безопасно объединить и обновить объект. Он создает запросы O (2N), но если это становится проблемой, я мог бы упростить его в один оператор слияния.

http://en.wikipedia.org/wiki/Merge_(SQL)

+0

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

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