流利的nhibernate第一级缓存不能按预期工作

时间:2013-01-11 23:08:16

标签: nhibernate fluent-nhibernate linq-to-nhibernate nhibernate-caches

我有一个在一个会话中被多次调用的函数。根据我对NHibernate第一级缓存的理解,无论调用次数如何,同一会话中的精确查询只会执行一次。

但事实并非如此。下面是代码片段,我可以看到在NHProfiler中执行的查询多次调用该函数。

    public List<CustomerType> GetAllActiveCustomerTypes()
    {
        return _unitOfWork.CurrentSession.QueryOver<CustomerType>().Where(x => x.Active).List();
    }

我在这里理解NHibernate时遗漏了什么?

由于

1 个答案:

答案 0 :(得分:4)

您的经历是正确的。查询不会被会话第一级缓存缓存。为了扩展理解,请阅读:First and Second Level caching in NHibernate

第一级缓存的摘录:

  

...第一级缓存也称为身份映射,不使用   只是为了减少到数据库的往返次数来改善   申请的速度,但也保证没有   存在两个具有相同id的对象的不同实例......

  

... 使用NHibernate时,会自动进行第一级缓存   只要一个人使用标准会话对象 ...就行了   NHibernate通过数据库中的唯一ID加载实体   然后它会自动进入所谓的身份地图......

如上所述,它用于entity缓存目的。

二级缓存提取:

  • ...可以在第二级缓存中缓存单个实体或整个聚合。
  • ...还可以在二级缓存中缓存(复杂和/或耗时)查询。