【发布时间】:2012-01-14 01:04:47
【问题描述】:
我正在使用 NHibernate 2.1,并且有一些实现 IPreInsertEventListener、IPreUpdateEventListener、IPreDeleteEventListener 的侦听器。
两个侦听器执行最后一分钟的数据库操作。两者都与审计相关,但执行非常不同的审计操作,因此有不同的侦听器 - 一个侦听器审计所有内容并写入审计表,另一个只对少数实体类型感兴趣并更新不同表中的数据。
我遇到的问题是,在创建或更新我的审计实体并将它们保存到会话之后,侦听器又会尝试刷新会话,这会触发另一个更新,不久我就会收到 StackOverflowException。
以下是两个不同侦听器的示例:
// Generic audit listener (audits everything)
public bool OnPreUpdate(PreUpdateEvent evnt)
{
// Ignore audit entries, otherwise we go round and round
if (!(evnt.Entity == AuditEntry))
{
ISession session = evnt.Session.GetSession(EntityMode.Poco);
// create AuditEntry for the updated Entity
// ...
session.Save(auditEntity);
session.Flush();
}
}
// Restricted audit listener (only interested in a handful of entities)
public bool OnPreUpdate(PreUpdateEvent evnt)
{
if (evnt.Entity is RelevantToThisListener) // etc
{
ISession session = evnt.Session.GetSession(EntityMode.Poco);
// create or modify some other audit entity
// ...
session.Save(auditEntity);
session.Flush();
}
}
一种想法是只有 1 个审计侦听器来适当地委派任务并负责一次刷新。
但在走这条路之前,还有其他选择吗?是否可以启动此事件会话的另一个隔离会话,以便我只刷新新更改?
谢谢
【问题讨论】:
标签: c# .net hibernate nhibernate