【问题标题】:Why isn't my ILoadEventListener being called?为什么我的 ILoadEventListener 没有被调用?
【发布时间】:2012-02-16 04:06:26
【问题描述】:

我创建了一个实现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,所以我尝试使用它,并且确实触发了。所以我现在可以使用它,但我仍然不知道预加载/加载/后加载是什么。

【问题讨论】:

    标签: c# .net nhibernate


    【解决方案1】:

    这方面的文档几乎不存在,所以也许这会对一些人有所帮助:

    任何加载事件(Load/PreLoad/PostLoad)都不会在身份缓存中的实体上触发,即使您 GetLoad 或再次查询它也是如此。强>

    如果您以正确的方式斜视它,这种某种是有道理的,但由于不确定的行为,它会带来很大的挫败感,因为大多数时候,你不会' t 知道实体是否在缓存中。显然,这些事件是指水合一个实体的过程,而不是简单地请求它。

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

    实际上,这意味着如果您希望特定侦听器在“每个”实体上运行,您需要考虑它最初是由Save、@987654324 引入会话的临时实例的可能性@等。也就是说,如果你实现了IPostLoadEventListener,你可能还想实现IPostInsertEventListenerIPostUpdateEventListener

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2022-10-15
      • 2011-04-11
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多