gpt4 book ai didi

c# - 为什么我的 ILoadEventListener 没有被调用?

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:51 24 4
gpt4 key购买 nike

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

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

但是,它似乎从来没有被调用过——我已经在我的 OnLoad() 中添加了日志记录语句并在调试器中设置了一个断点——即使在使用我的应用程序时使用的方式可以清楚地从数据库中获取对象这个 NHibernate session 工厂。

我错过了什么?

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

最佳答案

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

任何加载事件(加载/预加载/后加载)都不会在身份缓存中的实体上触发,即使您 Get , Load ,或者重新查询。

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

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

在实践中,这意味着如果您希望特定的监听器在“每个”实体上运行,您需要考虑它最初是由 Save 引入 session 的临时实例的可能性。 , Update等。换句话说,如果你实现 IPostLoadEventListener , 你可能还想实现 IPostInsertEventListenerIPostUpdateEventListener .

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

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

关于c# - 为什么我的 ILoadEventListener 没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com