2

我對實體框架的理解是,如果它可以從它的緩存中回答查詢,它會。我簡單的測試結果則顯示,重複的查詢訪問數據庫,即使他們之前得到的答覆肯定:做Linq實體查詢*總是*命中數據庫?

var u1 = context.Users.SingleOrDefault(u => u.Id == 1); 
var u2 = context.Users.SingleOrDefault(u => u.Id == 1); 

這些查詢都是成功的。對於每一個,我在SQL Profiler中看到一個SELECT TOP (2)

爲什麼EF轉到數據庫進行第二次查詢?

回答

2

嗯,因爲EF不使用緩存。 nHibernate的確。 Here有關如何啓用EF緩存的文章。

編輯:EF沒有透明的現成緩存。但它在工作單元內有明確的緩存:ObjectContext.GetObjectByKey

+0

這是美中不足的蒼蠅。感謝您的信息,並鏈接到解決方案! – ladenedge 2010-10-11 15:32:38

+1

這並非完全正確。我認爲你會混淆EF和L2E。 LINQ to Entities默認不使用緩存,但EF *在其上下文中緩存物化實例。嘗試,例如,'ObjectContext.GetObjectByKey' – 2010-10-11 16:09:00

+0

@Craig Stuntz我的意思是透明的緩存(就像凝固意味着什麼)。 – Andrey 2010-10-11 17:15:42

3

EF始終執行查詢,但返回對象的同一個實例。第二個查詢沒有物化到新的對象中,而是由返回的第一個查詢創建的實例。這是關於該行爲的article。有一些附加概念可以強制第二個查詢來更新現有實例。

+0

好文章,謝謝! – ladenedge 2010-10-11 15:34:15