Быстрые NHibernate получают идентификатор сохраненного объекта

Я использую Быстрый NHibernate в приложении MVC Asp.net. У меня есть настроенный, чтобы запустить сессию и транзакцию по каждому запросу, и фиксировать транзакцию в конце запроса. Однако то, что я хочу сделать, является сохранением объект (в этом случае, новая "Компания"), и затем перенаправьте к странице детали той новой Компании. Как я получаю идентификатор новой компании так, чтобы я мог перенаправить? Если я получаю идентификатор после сессии. Сохраните (компания), это является пустым. Это имеет смысл, поскольку он еще не фиксировался, однако, все еще кажется, что должен быть относительно простой способ сделать это, не фиксируя текущую транзакцию и запустив новую.

5
задан Lachlan Roche 13 February 2010 в 18:10
поделиться

5 ответов

Хорошо, проблема была в другом месте моего кода. Вы можете получить идентификатор сразу после сохранения, даже если вы не зафиксировали транзакцию или не сбросили ее.

Спасибо всем за ответы, но, к сожалению, ни один из них не является полностью правильным.

2
ответ дан 14 December 2019 в 01:07
поделиться

Я думаю, что начинать транзакцию для каждого сеанса - плохая идея. Я использую сеанс на запрос, и я запускаю и фиксирую транзакцию в Session_EndRequest. Однако у меня обычно есть транзакция на странице, чтобы я мог обрабатывать любые возникающие там ошибки - к моменту возникновения EndRequest уже слишком поздно что-либо делать, кроме как отображать общее сообщение об ошибке.

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

0
ответ дан 14 December 2019 в 01:07
поделиться

Поскольку это транзакция, NHibernate откладывает изменения, и поэтому INSERT не отправляется в базу данных - и база данных не генерирует ID. Сделайте Session.Flush () - это не остановит транзакцию, но ваши изменения (INSERT) будут выполнены. Или используйте присвоенные идентификаторы. Или не всегда запускайте транзакции - делайте это явно (как, например, архитектура S # arp с атрибутом [Transaction]).

0
ответ дан 14 December 2019 в 01:07
поделиться

Может быть, он не настроен как автоматически созданный в базе данных? Как сказал Маттиас Якобссон, идентификатор должен быть установлен после сеанса. Сохранение

0
ответ дан 14 December 2019 в 01:07
поделиться

NHibernate генерирует идентификатор, когда session.Save () или session.SaveOrUpdate () вызывается с временным объектом. В это время свойство id объекта установлено и может использоваться.

Если генератору идентификаторов требуется доступ к базе данных, это произойдет в это время. Таким образом, для генератора идентификаторов вставка будет выполняться в это время, как и любые ожидающие вставки.

В противном случае вставка будет отложена до тех пор, пока сеанс не будет сброшен, что произойдет:

  • из некоторых вызовов Find () или Enumerable ()
  • из NHibernate.ITransaction.Commit ()
  • из ISession.Flush ()
7
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: