好吧,我采用了实现NHibernate侦听器的解决方案,所以我有一个像这样的侦听器:
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功能,非常强大。



