2009-05-04 49 views
27

我有幾種方法,與DB處理和所有的人都開始通過調用C#的LINQ到SQL - 如果DataContext的使用IDisposable的

FaierDbDataContext db = new FaierDbDataContext(); 

由於LINQ2SQL DataContext對象實現IDisposable配置,這應該使用與「使用」?

using (FaierDbDataContext db = new FaierDbDataContext()) { 
    // use db here 
} 

這樣或那樣使用它的含義是什麼?

+8

另外,一個側面說明,使用LINQ的人,你不應該讓你的DataContext的實例變量爲您的數據模型類。相反,每次你需要在你的方法中聲明一個。 – mmcdole 2009-05-04 19:34:11

回答

29

不同於實現 IDisposable的大多數類型的DataContext不 真正需要的配置 - 至少在大多數情況下 。我問馬特·沃倫 這個設計的決定,並在這裏 是他的迴應:

有我們實施 IDisposable的幾個原因:

  • 如果應用程序邏輯需要守住一個實體超越時 預計將使用DataContext或有效您可以通過調用Dispose執行該合同 。在 中,如果任何代碼嘗試導航延遲屬性,則實體仍將引用 DataContext,並嘗試使用它 。這些嘗試 將失敗。配置也迫使 的DataContext拋售其緩存的 物化實體,從而使單個 緩存的實體不會意外 永葆所有實體通過的DataContext,這將 否則造成什麼似乎是一個 內存泄漏物化 。
  • 自動關閉DataContext連接的邏輯可能是 被騙入離開連接 打開。 DataContext依賴於 應用程序代碼,它列舉了查詢的所有 結果,因爲結果集的結尾觸發 連接關閉。如果 應用程序使用IEnumerable的 MoveNext方法而不是C#或VB中的foreach 語句,則可以過早地退出 枚舉。如果您的 應用程序遇到 連接未關閉的問題,並且您的 懷疑自動關閉的行爲 不起作用,則可以使用Dispose 模式作爲解決方法。

source