NHibernate从属性调用“get”两次

本文关键字:两次 get 从属性 调用 NHibernate | 更新日期: 2023-09-27 18:31:32

我遇到这种情况:我正在开发一个带有 Spring.net 和Fluent NHibernate的软件,我注意到NHibernate的行为非常不寻常。我真的不知道它是否正确,但对于我的软件来说,它不会发生。我注意到NHibernate调用了两次getters,即使我在数据库中updating某些内容。例如,当我尝试在dabatase上insert一些值时,NHibernate gets属性中的值以放入数据库,然后它再次触发一个新get,我不知道为什么以及如何调用。我认为它尝试从缓存中检索值以比较两个值(数据库和缓存)并将更新的值保存在缓存中。

顺便说一下,对于某些实体,我有一个辅助缓存级别,但这种情况发生在具有和没有此辅助缓存级别的实体上。

有什么帮助吗?谢谢。

NHibernate从属性调用“get”两次

  1. 您应该能够使用当前堆栈轨道的打印找到它特别是getter并将其与其他跟踪进行比较。这应该显示起点。

  2. 我想到了什么:

      由于
    1. 二级缓存,缓存的向后get,因为它仅存储实体的属性。
    2. 有码计算呢?是使用属性还是字段?
    3. 验证会话中的对象在数据库中是否相同。

如果使用 get 意味着 NHibernate 对数据库运行选择以检索对象,则在插入/更新中,仅当您提供对象的 ID 并且该对象在会话中尚不可用时,才会执行此操作。

如果数据库中没有该对象,并且希望 NHibernate 插入一个新对象,请不要提供 ID 并正确配置 ID 映射的生成器

否则,请巧妙地使用代理并防止 NHibernate 通过使用Load<T>来检索完整对象,该实际上不会命中数据库,而是将代理放入当前会话范围。