При использовании транзакций с NHibernate старайтесь избегать использования Session.Flush () и вместо этого используйте транзакцию.Commit (), которую он вызывает session.flush () для внутреннего использования.
Если во время Commit () произошла ошибка, и транзакцию необходимо откатить, это можно исправить следующим образом.
public static void CommitChanges()
{
ITransaction transaction = Session.BeginTransaction();
try
{
transaction.Commit();
}
catch (HibernateException ex)
{
transaction.Rollback();
//close and dispose session here
throw ex;
}
finally
{
transaction.Dispose();
}
}
Теперь, если ручной вызов flush () или вызов commit () проходит успешно, нет способа откатить транзакцию с использованием механизмов NHibernate.
Особенно при вызове транзакции.Commit () команда AdoTransaction, созданная NHibernate, затем удаляется сразу после завершения Commit (), поэтому вы не можете получить к ней доступ для отката.
Приведенный выше пример кода позволяет отследить ошибки, возникающие во время фиксации, а затем откатить транзакцию, которая уже началась.
Теперь вместо вызова транзакции.Commit () в приведенном выше примере вы вызываете session.Flush () в моих тестах никакие данные не сохраняются в базе данных, так как транзакция никогда не фиксируется.
Я понятия не имею, как выглядит ваш код, но если вы вызываете в шаблоне, как показано в примере кода выше, то транзакция.com.com () вместо Session.Flush () должна дать вам способ достичь того, что вы хотите.