C# NHibernate呼叫“呼叫”;获得;两次从一处房产

C# NHibernate呼叫“呼叫”;获得;两次从一处房产,c#,nhibernate,caching,fluent-nhibernate,spring.net,C#,Nhibernate,Caching,Fluent Nhibernate,Spring.net,我有这样的情况:我正在用Spring.net和Fluent NHibernate开发一个软件,我注意到NHibernate的行为非常不寻常。我真的不知道它是否正确,但对于我的软件来说,它不可能发生。我注意到NHibernate调用了两次所有的getter,即使我在更新数据库中的某些内容时也是如此。例如,当我尝试在dabatase上插入一些值时,NHibernate从属性中获取要放在数据库上的值,然后它再次触发一个新的get,我不知道调用它的原因和方式。我认为它试图从缓存中检索值,以比较两个值(数

我有这样的情况:我正在用Spring.net和Fluent NHibernate开发一个软件,我注意到NHibernate的行为非常不寻常。我真的不知道它是否正确,但对于我的软件来说,它不可能发生。我注意到NHibernate调用了两次所有的
getter
,即使我在
更新数据库中的某些内容时也是如此。例如,当我尝试在dabatase上插入一些值时,NHibernate
从属性中获取要放在数据库上的值,然后它再次触发一个新的
get
,我不知道调用它的原因和方式。我认为它试图从缓存中检索值,以比较两个值(数据库和缓存),并将更新后的值保存在缓存中

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

有什么帮助吗?多谢各位

  • 您应该能够使用当前堆栈轨迹的打印找到它 特别是getter,并将其与其他跟踪进行比较。这应该 向你展示出发点

  • 我脑子里想的是:

  • 向后
    get
    进行缓存,因为二级缓存只存储实体的属性
  • 那么代码计算呢?是否使用属性或字段
  • 验证会话中的对象是否与数据库中的相同

  • 如果使用get,您的意思是NHibernate在数据库上运行select以检索对象,则只有在您提供了对象的ID且该对象在会话中不可用时,才能在insert/update中执行此操作

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


    否则,请巧妙地使用代理,并通过使用
    Load
    阻止NHibernate检索完整对象,这实际上不会命中数据库,但会将代理放入当前会话范围。

    坦率地说,如果您将getter设计为缓慢和/或有副作用,我认为您是在自找麻烦。这并不是一个有成就的人应该做的。