2010-10-29 57 views
2

我有以下代码NHibernate的LINQ - 缓存问题

factory = new Configuration().Configure().BuildSessionFactory(); 
session = factory.OpenSession(); 
var query = session.Linq<Root>(); 
var data = query.ToList<Root>(); 
var data2 = query.ToList<Root>(); 

这一个生成2个SQL查询,让我明白,一级缓存是行不通的。 针对nhibernate的LINQ是否管理一级缓存?如果是,如何配置?

感谢您的提前。

回答

6

这是一个误解,一级缓存通常会避免执行sql。

查询总是在数据库上执行。无论实例是否已在内存中,这都可以100%确保结果完全相同。例如,当使用连接或条件时,这可能很重要。如果查询实际上包含联接或where子句,则没有区别。

第一级缓存确保在数据库中表示相同实例时返回相同的实例。当NHibernate在查询返回的内存中找到同一个对象时,它执行sql,然后它返回缓存中的那个对象。但是在执行sql之前它不知道。

只有当您使用session.Getsession.Load时,NH才会执行缓存查找并在查找实例时避免查询。对于NHibernate,AFAIK,Linq对缓存没有什么特别之处。