为什么不调用我的ILoadEventListener?

时间:2011-08-31 19:38:15

标签: c# .net nhibernate

我创建了一个实现ILoadEventListener的类,并实现了一个OnLoad()方法(当然 - 否则它甚至不会编译)。创建“new NHibernate.Cfg.Configuration()”后,我添加as the documentation says

configuration.EventListeners.LoadEventListeners = new ILoadEventListener[] {
    new MyListener(),
    new NHibernate.Event.Default.DefaultLoadEventListener()
};

但是,它似乎永远不会被调用 - 我已经在我的OnLoad()中添加了日志语句并在调试器中设置了一个断点 - 即使在使用我的应用程序的方式明确地从数据库中获取对象时也是如此这个NHibernate会话工厂。

我错过了什么?

编辑:我在源代码中讨论过(NHibernate事件文档相当稀疏),并发现对应于IInterceptor的事件实际上是PreLoad,而不是Load,所以我尝试使用它,而那个确实触发了。所以我现在可以使用它,但我仍然不知道预加载/加载/后加载是什么。

1 个答案:

答案 0 :(得分:6)

关于此的文档实际上是不存在的,所以这可能会帮助一些人:

即使您GetLoad或对其进行查询,也不会在身份缓存中的实体上触发任何加载事件(Load / PreLoad / PostLoad)试。

如果你以正确的方式眯着眼睛看这个那种是有意义的,但是由于非确定性的行为导致很多挫折,因为大多数时候,你赢了' t 知道实体是否在缓存中。显然,这些事件指的是保护一个实体的过程,而不是简单地请求它。

我还没有测试过这个理论,但是如果来自L2缓存的缓存命中也不会触发Load事件,我也不会感到惊讶,因为这些实体也不会被水合。

实际上,这意味着如果您希望特定侦听器在“每个”实体上运行,您需要考虑它最初是由Save引入会话的瞬态实例的可能性, Update等。换句话说,如果您实施IPostLoadEventListener,您可能还想实施IPostInsertEventListenerIPostUpdateEventListener

这实际上不会改变行为 - 侦听器仍将只运行实体与会话关联的第一时间 - 但至少这可以保证您可以从中检索的每个实体该会话已被该听众拦截。就我而言,我试图使用PostLoad向实体注入一些东西,所以这是一个可接受的解决方法。

如果您真的需要侦听器在每次时间内触发实体,则需要使用无状态会话(无缓存)或在再次加载/查询之前逐出实体。