Мне нужно выполнить две операции внутри единицы работы NHibernate: транзакционную (сохранение объекта) и нетранзакционную.
нетранзакционную операцию нельзя откатить, если я сохраню объект до выполнения нетранзакционной операции (и, наконец, фиксации транзакции), я все равно получу транзакционное поведение:
Проблема : с таким кодом, как показано ниже, NHibernate выиграл ' t выполнить фактическую вставку sql до вызова transaction.Commit () (который вызывает session.Flush () внутренне):
using (var transaction = session.BeginTransaction())
{
session.Save(entity);
NotTransactionalOperationBasedOn(entity);
transaction.Commit(); // the actual sql insert will be executed here
}
С таким кодом, если вставка Sql завершается неудачно, уже слишком поздно: NotTransactionalOperation была выполнена. Чтобы выполнить фактическую вставку SQL перед выполнением NotTransactionalOperation, я должен явно вызвать session.Flush () прямо перед session.Save ():
using (var transaction = session.BeginTransaction())
{
session.Save(entity);
session.Flush(); // the actual sql insert will be executed here
NotTransactionalOperationBasedOn(entity);
transaction.Commit();
}
Код работает, но ... считается ли это лучшей практикой для вызова session.Flush () перед совершением транзакции? Если нет, есть ли лучшие способы достичь того же результата?