为什么不调用我的ILoadEventListener?

Ken*_*Ken 1 .net c# nhibernate

我创建了一个实现的类ILoadEventListener,并实现了一个OnLoad()方法(当然 - 否则它甚至不会编译).创建"new NHibernate.Cfg.Configuration()"之后,我按照文档说明添加它:

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

然而,它似乎永远不会被调用 - 我已经在我的OnLoad()中添加了日志语句并在调试器中设置了断点 - 即使在使用我的应用程序时,使用此NHibernate会话从数据库中清楚地获取对象厂.

我错过了什么?

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

Aar*_*ght 6

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

无(负载/预紧/餐后)都不会开火是在身份缓存的实体,即使你加载事件Get,Load再次,或查询它.

这个排序是有道理的,如果你眯着眼睛看着它恰到好处的方式,但它使挫折,由于不确定性的行为很大,因为大多数时候,你不会知道一个实体是否是在缓存.显然,这些事件是指为实体提供保湿而不是简单地要求实体的过程.

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

在实践中,这意味着如果你想有一个特定的听众对"每一个"实体运行,你需要考虑的可能性,它本来该被引入到会话的瞬态的实例Save,Update等等.换句话说,如果你实现IPostLoadEventListener,你可能也想实现IPostInsertEventListenerIPostUpdateEventListener.

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

如果每次检索实体时确实需要触发器,则需要使用无状态会话(无缓存)或在再次加载/查询之前逐出实体.