NHibernate FlushMode при сохранении - PullRequest
4 голосов
/ 11 января 2009

Я установил свойство FlushMode в сеансе NHibernate равным FlushMode.Never, но когда я вызываю session.Save (User), в любом случае в базу данных делается вызов. Это как это должно работать? Я думаю, что вставка не должна выполняться, пока я не вызову Flush ().

Edit: Я нашел проблему, я изменил первичный ключ на guid, и это сработало. Существуют ли другие типы (т. Е. Первичный ключ guid), которые будут работать? Я бы предпочел номер вместо гида ...

Ответы [ 3 ]

8 голосов
/ 11 января 2009

Вы использовали собственный генератор, верно?

Проблема в этом заключается в том, что, поскольку именно БД генерирует ID, NHibernate требуется круговая передача для его получения. Например, для полей идентификации Сервера фактическая инструкция INSERT должна быть выполнена до того, как SCOPE_IDENTITY () вернет действительный ключ. И единственный способ безопасно выполнить эту операцию - очистить сеанс.

В качестве альтернативы руководству и идентификатору вы можете попробовать генератор «приращения», чтобы увидеть, соответствует ли он вашим потребностям: http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html#mapping-declaration-id-generator

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

PS: для дальнейшего чтения попробуйте http://unhandled -exceptions.com / blog / index.php / 2008/12/11 / на выбор типа идентификации /

1 голос
/ 11 января 2009

Я обнаружил проблему, я использовал личность в качестве первичного ключа. Изменение на guid сработало.

0 голосов
/ 11 января 2009

Попробуйте обернуть session.Save (Пользователь) в транзакции и установите для FlushMode значение Commit.

Это должно гарантировать, что звонки на БД не производятся.

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