2011-05-26 58 views
2

我正在使用L2S檢查密鑰是否已存在,如果不存在,請創建並插入一個密鑰。同樣的DataContext也用於在同一個C#方法中執行其他查詢。在完成它之後,我正在使用using關鍵字來處理DataContext。我迷上了sql分析器,看到它會登錄,執行查詢,然後註銷。即使相同的DataContext稍後會執行查詢或更新,它似乎也會這樣做。我認爲datacontext只登錄一次,並在該會話期間執行所有查詢?你多久打電話給SubmitChanges()很重要?或者我錯過了什麼?Linq2Sql datacontext登錄/註銷行爲

嘲笑我所看到的:

using(Datacontext) 
{ 
     //Audit Login 
     var b = DataContext.Table.FirstOrDefault(t=>t.Id == 4); 
     //RPC: Completed 
     //Audit Logout 

     //Audit Login 
     var x = DataContext.OtherTable.Any(t=>t.Id == 4); 
     //RPC: Completed 
     //Audit Logout 

} 

更新

SQL事件探查器中顯示爲幾百毫秒這些註銷的「持續時間」。那段時間我的應用程序正在等待?

+1

你也可能要更改FirstOrDefault這裏的SingleOrDefault(假設你ID是唯一的......你總是會得到一個結果)。這將從您的SQL問題中刪除「Top 1」。也許你再次獲得一些毫秒 – Pleun 2011-05-26 15:18:43

回答

1

FirstOrDefault執行一個查詢,因爲它需要給你一個結果回來,而不是一個潛在的集合 - Any也是如此。當你創建一個DataContext時,它不會馬上登錄。我可以向你保證,雖然這可能看起來「不好」,但它完全沒問題。

+0

但sql分析器顯示這些註銷的「持續時間」爲幾百毫秒。那段時間我的應用程序正在等待? – 2011-05-26 15:14:02

1

在Linq-2-sql中任何()和.FirstOrDefault()調用你在這裏使用它們的方式都不會被延遲。當你給他們打電話時,他們會導致執行發生。所以在這種情況下,它們會立即啓動,這也是您在剖析器中注意到的。

參見:How to maintain LINQ deferred execution?

我認爲你是對另一方面有點混合查詢,一方面和更新的延遲執行。

每次調用Submitchanges時,都會提交等待發生的所有更改。通常你只需要做一次這樣的事情,所有的改變都是在一次事務中完成的。

1

L2S datacontext不保留連接,這就是您在profiler中看到Login/Logout的原因。它確實會持續狀態,這對變化跟蹤很重要。

下面是L2S的DataContext管理的好文章:http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management

+0

如果它不保留連接,那麼它在事務範圍中的表現如何?底層代碼似乎阻止在完成時關閉連接(如果存在事務範圍);然而,我注意到在進入事務範圍10到15分鐘並在該範圍內反覆調用SubmitChanges ......最終會出現一個突然的,看似隨機的「Audit Logout」,並且連接關閉,導致交易失敗。交易超時時間爲6小時,但這在10至15分鐘內失敗,原因不明。 – Triynko 2011-11-21 21:47:34