Работа с нарушениями ограничений из БД в NHibernate - PullRequest
0 голосов
/ 10 марта 2009

У меня есть то, что я считаю довольно распространенным случаем использования NHibernate. Я создаю сущность и пытаюсь сохранить ее, используя ISession.Save (), а затем Transaction.Commit (). На данный момент, я ожидаю, что нарушения таких вещей, как ограничения уникального / первичного ключа, станут мне исключением. Однако я вижу только GenericADOException. Это не помогает мне отличить подлинные сбои БД от таких вещей, как просьба выбрать другое имя для сущности, чтобы сохранить уникальность.

В настоящее время я реализовал уродливый обходной путь запроса в первую очередь, чтобы гарантировать, что ограничения не будут нарушены. Это просто состояние гонки, которое должно произойти, и я действительно не хочу, чтобы пользователи видели: «Ой, БД сделала что-то смешное! виды сообщений.

Есть ли элегантный способ исправить это?

1 Ответ

0 голосов
/ 11 марта 2009

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

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