Ну, я принял решение, реализующее NHibernate Listeners, поэтому у меня есть такой слушатель:
public class CustomSaveUpdateEventListener : IPostInsertEventListener, IPostUpdateEventListener {
private void ScheduleToCommit(AbstractPostDatabaseOperationEvent @event) {
// Some filter
if (@event.Entity.GetType().FullName.Equals(MY_ENTITY_TO_INTERCEPTS) {
object o = @event.Entity;
// Some logic...
// ...
// ...
IQuery namedQuery = @event.Session.GetNamedSQLQuery(MY_NAMED_QUERY);
//namedQuery.SetParameter(...); // <== You can set parameters
//namedQuery.ExecuteUpdate(); // <== DO NOT EXCEUTE HERE, this launches more events recursively and can generate stackoverflow
@event.Session.ActionQueue.RegisterProcess(new MyActionBeforeCommit(@event, namedQuery).SaveValuesOperation);
}
}
}
public void OnPostInsert(PostInsertEvent @event) {
ScheduleToCommit(@event);
}
public void OnPostUpdate(PostUpdateEvent @event) {
ScheduleToCommit(@event);
}
}
И мой объект MyActionBeforeCommit()
планируется запустить только тогда, когда и если транзакция совершается. Итак, в моем «будущем действии» я имею:
public class MyActionBeforeCommit {
private AbstractPostDatabaseOperationEvent e;
private IQuery query;
public MyActionBeforeCommit(AbstractPostDatabaseOperationEvent e, IQuery query) {
this.e = e;
this.query = query;
}
public void SaveValuesOperation() {
// Here your query will be executed only when a transation is commited, if
// it's rolledback this won't be executed
query.ExecuteUpdate();
}
}
И, наконец, нам нужно зарегистрировать нового слушателя в конфигурации NHibernate, например:
Configuration.SetListener(ListenerType.PostInsert, new CustomSaveUpdateEventListener());
Configuration.SetListener(ListenerType.PostUpdate, new CustomSaveUpdateEventListener());
И это работает очень хорошо. Это очень хорошая функция NHibernate, очень мощная.