2011-01-05 176 views
1

我從NHibernate的背景下,以實體框架V4.0的到來。當我將實體加載到ObjectContext中時,只要ObjectContext存在('第一級緩存'),我希望它們可以在那裏被緩存。因此,如果第二次執行相同的查詢,則對象已經在ObjectContext中,不應再次加載。怪異的行爲

看一看這個查詢:

 using (var context = new Model1Container()) { 
      //load entities from DB 
      var entities = context.Entity1Set.ToArray(); 
      //entities should now be cached in the context (1st level cache) 

      //why does this call not use the cached items? 
      entities = context.Entity1Set.ToArray(); 
     } 

在SQL Server Profiler中,我可以清楚地看到,無論ToArray的()調用觸發數據庫查詢。爲什麼第二個查詢需要一個DB往返,而不是NHibernate的行爲?

謝謝!

回答

1

EF 4.0不支持任何形式的緩存,無論是第一級還是第二級緩存都不如NHibernate。

一個功能類似於NHibernate的一級緩存在EF 4.1中實現。

EF 4.1 Local Data

HTH

Riana

2

好問題。我從來沒有使用過NHibernate,但我在去年左右一直在使用Entity Framework。

在某些方面,你描述的行爲對我來說很有意義。如果數據庫中的數據在調用之間改變會怎樣?例如,實體框架必須重新查詢數據庫以檢查是否有任何新行已添加到數據庫表中。

然而,對結果執行LINQ查詢將不要求其它往返到數據庫,因爲實體框架將獲取的現有實體出的ObjectContext的。

var newEntities = entities.Where(x=>x.id==1).ToList(); 
var newEntities2 = entities.Where(x=>x.id==1).ToList(); 
+0

同意的基礎上,具有與特定ID已在上下文中不需要另一輪訪問數據庫做我的經驗操作。一般操作,比如給我所有的東西都會去db。 – e36M3 2011-01-05 19:30:27

+0

好吧,這並不奇怪,因爲如果你在'entities'數組上執行.Where()方法,你實際上使用LINQ到對象而不是LINQ to Entities。 不知LINQ到實體一般是能夠查詢緩存結果 – cheeesus 2011-01-05 20:09:20

+0

另一件事:如果我們生活的ObjectContext這麼久,在數據庫中的數據可以在通話之間切換,我們可以使用ObjectContext.Refresh。 ObjectContext大多數時間很短,因此我們不關心數據庫在其生命週期中的更改 – cheeesus 2011-01-05 20:12:25