2013-08-06 59 views
0

我有一個實體是這樣的:EF 4刷新數據

public class Customer 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

我使用LINQ如下閱讀:

public IQueryable<Customer> GetCustomer() 
{ 
    var result = from cust in _dbContext.Customers.AsNoTracking() select cust; 
    return result; 
} 

第一次一切工作就好了,但是當我在添加一個客戶數據庫手動,同一個客戶沒有反映在這個查詢中,它總是返回舊的記錄。

那麼我怎麼總是從DB獲取更新的客戶?

注:我使用EF 4

回答

0

問題是方法調用.AsNoTracking()的AsNotracking()方法是數據的分離列表中,確定在5.1項的鏈接http://msdn.microsoft.com/en-us/data/hh949853.aspx上解釋了這一點:

如果您處於只讀場景並且想要避免將對象加載到ObjectStateManager中的開銷,您可以發出「No Tracking」查詢。更改跟蹤可以在查詢 級別禁用。

請注意,通過禁用更改跟蹤,您實際上是關閉對象緩存 。當您查詢實體時,我們不能通過從ObjectStateManager中拉取先前實現的查詢結果 來跳過實現。如果您在同一上下文中針對相同實體重複查詢 ,則實際上您可能會看到啓用更改跟蹤帶來的性能優勢。

當使用ObjectContext的,和的ObjectQuery實例對象集將 記得MergeOption一旦設置,並且被 由他們將繼承父 查詢的有效MergeOption查詢查詢。使用DbContext時,可以通過在DbSet上調用 AsNoTracking()修飾符來禁用跟蹤。

即使除去.AsNoTracking(後刪除.AsNoTracking()的鏈接查詢

+0

)也是它仍然從緩存中讀取,而不是反映了DB的日期。 –

+0

我使用上面的代碼,它運作良好。這可能取決於您如何在上下文中輸入數據。執行插入時,您使用_dbContext.Customers.Add(customer)....或通過SQLComand執行插入操作? –

+0

我已經在DB中手動插入了該記錄,那麼如何刷新上下文? –