Транзакции в замке ActiveRecord + NHibernate для чайников - PullRequest
0 голосов
/ 23 января 2010

Я хотел бы сделать следующее, все в одной атомарной транзакции:

  1. Чтение объекта через ActiveRecord
  2. Сохранить новый объект через ActiveRecord
  3. Обновление другой таблицы через NHibernate

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

Я никогда раньше не использовал транзакции ни в AR, ни в NH, поэтому, пожалуйста, предоставьте как можно больше подробностей. Как взаимодействуют механизмы транзакций?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2010

Ну, замок ActiveRecord зависит от NHibernate. Правда, класс транзакции Castle ActiveRecord отличается от класса, найденного в NHibernate; но вы должны думать об ActiveRecord как обёртке по сравнению с NHibernate.

Так что нет необходимости "играть вместе". Потому что в глубине души они одинаковы.

Другая важная концепция - это «Сессия». «Сессия» - это единица работы, «окно», которое вы используете, чтобы сообщить NHibernate, что вы хотите делать: запросы, обновления, вставки и т. Д. Опять же, есть сессия NHibernate и сессия Castle ActiveRecord. Опять же, последний является оберткой над первым.

Это важно, потому что когда вы используете сеанс в ActiveRecord (а на самом деле вы всегда это делаете, даже если неявно), вы можете получить доступ к «скрытому» сеансу NHibernate внутри него; обычно с использованием делегата, переданного методу Execute. И именно так вы можете использовать оба стиля кода внутри своего приложения (см. Пример Execute Callback здесь ).

Чтобы лучше понять значение сеанса, см. Здесь .

Наконец, я предлагаю всегда использовать стиль ActiveRecord для объявления сессий и транзакций, даже при смешивании обоих стилей кодирования. Так как они представляют также сеансы и транзакции NHibernate, вы в безопасности. Чтобы лучше понять это, пожалуйста прочитайте здесь .

PS: Да, я не писал пример, который вы просили (слишком ленив для этого), но я считаю, что будет лучше для вашего учебного процесса, если вы напишите его. Поверьте мне, это проще, чем вы думаете.

0 голосов
/ 04 мая 2011

Вот быстрый старт для нового проекта (созданного за последние недели)

https://github.com/haf/Castle.Facilities.NHibernate/wiki/NHibernate-Facility---Quick-Start

...