我有一个在一个会话中被多次调用的函数。根据我对NHibernate第一级缓存的理解,无论调用次数如何,同一会话中的精确查询只会执行一次。
但事实并非如此。下面是代码片段,我可以看到在NHProfiler中执行的查询多次调用该函数。
public List<CustomerType> GetAllActiveCustomerTypes()
{
return _unitOfWork.CurrentSession.QueryOver<CustomerType>().Where(x => x.Active).List();
}
我在这里理解NHibernate时遗漏了什么?
由于
答案 0 :(得分:4)
您的经历是正确的。查询不会被会话第一级缓存缓存。为了扩展理解,请阅读:First and Second Level caching in NHibernate
第一级缓存的摘录:
...第一级缓存也称为身份映射,不使用 只是为了减少到数据库的往返次数来改善 申请的速度,但也保证没有 存在两个具有相同id的对象的不同实例......
和
... 使用NHibernate时,会自动进行第一级缓存 只要一个人使用标准会话对象 ...就行了 NHibernate通过数据库中的唯一ID加载实体 然后它会自动进入所谓的身份地图......
如上所述,它用于entity
缓存目的。
二级缓存提取: