0

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

顺便说一句,对于某些实体,我有二级缓存级别,但是这种情况发生在具有和不具有二级缓存级别的实体上。

有什么帮助吗?谢谢你。

4

2 回答 2

0

如果使用 get 您的意思是 NHibernate 在数据库上运行选择以检索对象,则在插入/更新中,只有当您提供对象的 ID 并且该对象在会话中不可用时才会这样做。

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

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

于 2013-09-29T12:38:46.800 回答
0
  1. 您应该能够使用 print of current stack track 特别是 getter 找到它,并将其与其他跟踪进行比较。这应该向您显示起点。

  2. 我想到了什么:

    1. get由于二级缓存仅存储实体的属性,因此向后缓存。
    2. 有代码计算呢?它是使用属性还是字段?
    3. 验证会话中的对象是否与数据库中的相同。
于 2013-09-18T10:44:50.933 回答