2010-10-29 85 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對緩存沒有什麼特別之處。