Свободный NHibernate получить идентификатор сохраненного объекта - PullRequest
5 голосов
/ 11 февраля 2010

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

Ответы [ 5 ]

7 голосов
/ 13 февраля 2010

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

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

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

  • из некоторых вызовов Find () или Enumerable ()
  • от NHibernate.ITransaction.Commit ()
  • из ISession.Flush ()
2 голосов
/ 13 февраля 2010

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

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

0 голосов
/ 11 февраля 2010

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

0 голосов
/ 11 февраля 2010

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

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

0 голосов
/ 11 февраля 2010

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

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