2012-02-16 43 views
1

我正在通過傳遞一個已經打開的連接來創建一個LINQ to SQL DataContext。這是有效的,除非我現在在各處泄漏連接,因爲儘管我在完成時處理DataContext,但連接永遠不會關閉。我明白這是設計。LINQ to SQL,重寫處理

我想要做的是確保我的連接在我的DataContext被處置後關閉。

我試圖重寫處置的DataContext的,就像這樣:

protected override void Dispose(bool disposing) 
{ 
    this.Connection.Close(); 
} 

然而,這並不工作...我得到的ObjectDisposedException。設置一個斷點告訴我,在這一點上已經完成了一切!

我發現的唯一解決方法是在DataContext上隱藏Dispose方法。像這樣:

public new void Dispose() 
    { 
     this.Connection.Close(); 

     base.Dispose(); 
    } 

但是,這對我來說有點不好的代碼味道。推薦的方式是什麼?

完整代碼示例(DataClasses1DataContext是一個空的DataContext):

class Program 
{ 
    static void Main(string[] args) 
    { 
     string connectionString = "server=localhost;initial catalog=master;Integrated Security=SSPI;"; 

     for (int i = 0; i < 100; i++) 
     { 
      var connection = new SqlConnection(connectionString); 
      connection.Open(); 

      var ctx = new DataClasses1DataContext(connection); 
      ctx.ExecuteCommand("declare @i int"); 

      ctx.Dispose(); 
     } 

     Console.ReadKey(); 
    } 
} 

public partial class DataClasses1DataContext 
{ 
    protected override void Dispose(bool disposing) 
    { 
     // This will throw an ObjectDisposedException 
     // this.Connection.Close(); 
    } 

    public new void Dispose() 
    { 
     // This will work 
     // this.Connection.Close(); 

     //base.Dispose(); 
    } 
} 
+0

覆蓋Dispose方法調用的異常是什麼? – 2012-02-16 14:40:32

+0

我得到一個ObjectDisposedException – TheNextman 2012-02-16 14:41:38

+0

什麼是ObjectDisposedException的消息? – jrummell 2012-02-16 14:48:06

回答

2

問題是調用Dispose(bool)之前Dispose()disposed。當您致電Connection時,會導致異常。似乎沒有辦法解決這個問題。我不得不問,爲什麼這是必要的? Dispose(bool)Provider上調用Dispose,其中包含Connection,並應自動關閉它。

+0

謝謝。從查看反射器看來,連接似乎只能在某些條件下處理(可能,如果首先由Linq打開SQL的話)。 – TheNextman 2012-02-16 17:24:55

+0

從表面上看,至少,似乎Linq to SQL沒有公共提供者模型,我可以改變它。似乎我的解決方法是唯一的方法。 – TheNextman 2012-02-16 17:27:02

+0

@ TheNextman:你在使用'SqlProvider'嗎?看來它應該總是關閉連接。除非我錯過了'conManager'設置爲'null'的地方(它是在分支之外構建的)。 – Guvante 2012-02-16 17:48:02