Скорее всего, это , поскольку окружающая транзакция совершает , даже генерируется исключение.Или вы перехватываете исключение позже и скрываете ошибку от окружающей транзакции. Обновление может выполняться NH всякий раз, когда он сбрасывает сеанс , например, перед выполнением запросов.Фиксация всегда синхронизирует состояние памяти с базой данных.
Обновление необходимо только для экземпляров, которые еще не находятся в сеансе (но в базе данных).Все в сеансе синхронизируется с базой данных, в любой момент времени, самое позднее при фиксации.
Одним из преимуществ NH является то, что называется "невежеством постоянства".Это означает, что после загрузки экземпляров в память ваша логика больше не заботится о постоянстве.Вы используете свои классы, как и любой другой, в конце все будет сохранено (или откатано) атомарным способом.
Так, что это все означает для вашего кода?
- Напишите свой код, как если бы не было NHibernate или постоянство .Это также повысит удобство обслуживания и тестируемость.
- То, что вы делаете в памяти, является окончательным .У вас нет второго «магазина» шаг.Не делайте того, чего не хотите.
- Ваша память должна быть такой же согласованной, как и база данных .Ваша логика всегда основана на состоянии памяти (например, вычисления).Несогласованная память нарушит целостность приложения.Поэтому вам не следует фиксировать, когда в базе данных есть данные, которые вам не нужны.
- Фиксация - это все или ничего .Либо вы довольны своими изменениями, либо откатываете все.
- Обработка исключений - сложная задача .Не всегда легко решить, можете ли вы продолжить транзакцию.
- Изменение состояния объекта является обязанностью вашей бизнес-логики .NHibernate не будет «сбрасывать» ни одного экземпляра.(Существует Refresh, но он не будет работать здесь, и вы все равно не должны его использовать).Поэтому, если вы хотите сбросить значение, вам нужно написать бизнес-логику, которая сбрасывает значение.