我遇到这种情况:我正在使用Spring.net和Fluent NHibernate开发一个软件,我注意到NHibernate的行为非常不寻常。我真的不知道它是否正确,但对于我的软件,它不可能发生。我注意到NHibernate正在调用所有getters
两次,即使我在数据库上updating
。例如,当我在dabatase上尝试insert
一些值时,NHibernate gets
将属性中的值放到数据库中,然后再次触发一个新的get
,我不知道知道为什么以及如何调用。我认为它试图从缓存中检索值以比较两个值(数据库和缓存)并将更新的值保存在缓存中。
顺便说一下,对于某些实体,我有一个二级缓存级别,但这种情况发生在具有和没有第二级缓存级别的实体上。
有任何帮助吗?谢谢。
答案 0 :(得分:0)
您应该可以使用当前堆栈轨道的打印找到它 特别是吸气剂并将其与其他痕迹进行比较。这应该 告诉你起点。
我想到了什么:
get
用于缓存,因为它存储二级缓存,因为它只存储实体的属性。答案 1 :(得分:0)
如果你的意思是NHibernate在数据库上运行一个select以检索对象,那么只有在你提供了对象的ID且对象在会话中尚未提供时,才会在插入/更新中执行此操作。 / p>
如果您没有数据库中的对象并希望NHibernate插入新对象,请不要提供ID并正确配置ID映射的生成器
否则,聪明地使用代理并阻止NHibernate使用Load<T>
来检索完整对象,{{1}}实际上不会访问数据库,而是将代理放入当前会话范围。