2012-10-22 64 views
6

我讀here,當查詢讀取操作的數據時,將ObjectTrackingEnabled設置爲false可以提高性能。我的查詢是這樣的:ObjectTrackingEnabled和LINQ-to-sql

public return type TheQueryName (some parameters) 
{ 
    using (TheDC MyDC = new TheDC()) 
    { 
     var TheQuery = (...).ToList(); 

     return TheQuery; 
    } 
} 

1)如果我想要添加的性能增強,我纔剛剛前行添加行ObjectTrackingEnabled = true;var TheQuery = (...).ToList();

2)另外,如果我在查詢中設置ObjectTrackingEnabledtrue,在返回之前是否需要將其設置爲false,或者我只是爲數據上下文的特定實例設置ObjectTrackingEnabled,以及下面的時間我將實例化新的數據上下文,ObjectTrackingEnabled的值將恢復返回t o其默認狀態爲false

注意:我只打算添加ObjectTrackingEnabled = false;來閱讀操作。

謝謝。

+0

這是另一種有用的博客文章的事情如何變得瘋狂失控,如果你不必要的跟蹤事情:https://weblog.west-wind.com/posts/2014/dec/21/gotcha -entity-framework-gets-slow-in-long-iteration-loops –

回答

8

ObjectTrackingEnabled控制您的數據上下文(您的案例中的TheDC)是否會在實體加載後跟蹤對實體的更改。無論你想不想取決於你的具體情況。

自然地,擁有數據上下文的事情會減少,但會增加的跟蹤變化。爲什麼變化追蹤很酷?因爲你可以:

  1. 加載了一些情況下的一些實體
  2. 修改他們
  3. 添加新的,刪除他人
  4. 呼叫SaveChanges,讓數據上下文找出要做的修改實體UPDATE查詢,刪除刪除的文件等等

在禁用更改跟蹤的情況下,您必須明確告訴上下文更改了什麼,新值是什麼等。

假設您仍然不需要對象跟蹤,則會在每個特定數據上下文實例上設置該屬性。這意味着你必須要麼:

  1. 將其設置手動爲每個數據上下文創建
  2. 其設置爲像這樣的背景下的構造背景下默認:this.Configuration.AutoDetectChangesEnabled = true;的細節
this blog post

希望這有助於!

+0

爲了清楚起見,我只是將ObjectTrackingEnabled設置爲false來進行讀取操作。就語法而言,你可以看到關於點1)的問題嗎? – frenchie

+0

關於在哪裏禁用更改跟蹤,我會盡快創建上下文。因此,就你的情況而言,在查詢之前,在'using'語句 –

0

您的標籤和主題行稱'Linq2SQL',但您的問題是關於實體框架。

對於 '傳統' LINQ2SQL你需要這個來代替:

linq2SqlDBContext.ObjectTrackingEnabled = false; 
+1

Simon_Weaver之後,AFAIK「DataContext」是L2S中正確的術語; EF開始使用「ObjectContext」,然後添加並移至「DbContext」。另外,L2S提供ObjectTrackingEnabled;請參閱,例如:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/how-to-retrieve-information-as-read-only – pakx

+0

這就是我得到的使用同時生成3個不同的MS'datacontext'代: - / –

1

中提到:

1)如果我想添加的性能增強,我剛纔添加的行ObjectTrackingEnabled = true; just before the line var TheQuery = (...).ToList();

查詢性能增強來自NOT跟蹤。 因此,您想在READ查詢中禁用此功能,並在爲此創建新的datacontext之後立即禁用此功能。

ObjectTrackingEnabled = FALSE