2012-09-10 101 views
0

在實體框架(任何版本)中是否存在與此Rails輝煌的用於清除數據庫查詢緩存的等價物?我一直有這個問題,似乎無法找到一個簡單的方法來解決這個問題:實體框架緩存刷新

所有的關聯方法是圍繞高速緩存,這使可用於進一步操作的最近查詢的結果建立。緩存甚至可以在不同的方法間共享......

但是如果你想重新加載緩存呢,因爲數據可能已經被應用程序的其他部分改變了?只是通過真該協會電話:

customer.orders     # retrieves orders from the database 
customer.orders.size   # uses the cached copy of orders 
customer.orders(true).empty? # discards the cached copy of orders 
           # and goes back to the database 

回答

1

這是可能的,但這些方法都不能直接使用在實體。您必須與上下文交互才能達到此目的。

如果你需要重裝只是單一的情況下,你可以使用:

dbContext.Entry(order).Reload(); 

如果您需要重新加載由單個呼叫多個實例,您可能需要使用ObjectContext的API:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, customer.Orders); 

另一種方法是運行查詢而不是使用Refresh,但這需要您明確構建查詢以加載正確的訂單:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<Order>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
objectSet.Where(o => o.CustomerId == customer.Id).ToList(); 

查詢和Refresh之間的主要區別將是性能(Refresh可能會對集合中的每個訂單使用單獨的查詢)並且新實體(刷新僅重新加載您指定的實體,而查詢也將加載新的)。