Запретить изменения объекта вне транзакции - PullRequest
0 голосов
/ 22 марта 2012

мы недавно наткнулись на поведение NHibernate, которое доставило нам настоящую головную боль;).

Давайте рассмотрим следующий пример:

declare x
open transaction
  create and persist object x
commit transaction

change object x

open other transaction
  do nothing
close transaction

Удивило нас то, что изменения, внесенные в 'x' за пределами второй транзакции, в которой была зафиксирована база данных (хотя такое поведение имеет смысл и для меня, после того, как я об этом подумал). В нашей архитектуре это является некоторой проблемой, поэтому мы привыкли к другому поведению в мире, из которого пришли;).

Теперь вопросы:

  1. Можно ли запретить изменения объектов вне транзакции с NHibernate (например, сгенерировать исключение)?
  2. Можно ли зафиксировать только те изменения, которые были фактически внесены в текущую транзакцию?
  3. Есть ли какая-то совершенно другая вещь, которую мы могли бы сделать для обеспечения того, чтобы изменения в постоянных объектах производились только в определенной области видимости (using-директива, класс, пространство имен и т. Д.)?

Спасибо за ваши мысли, BaSche

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

Я бы ответил на ваши вопросы нет, нет и нет. Конечно, все возможно, например, вы могли бы сделать что-то некрасивое с INotifyPropertyChanged и выдать исключение, если нет транзакции. Но NHibernate не предназначен для работы, как вы хотите.

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

0 голосов
/ 22 марта 2012

Объект x не изменился за пределами транзакции, потому что при открытии сеанса вы создаете транзакцию не явно.Когда вы вызывали транзакцию.Commit () или когда вы закрывали сессию, это было сделано session.Flush (), и все ваши изменения были сохранены.

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