2012-02-16 13 views
1

LINQ to SQLのDataContextを既に開いている接続に渡して作成しています。これは動作しますが、私が終了した時点でDataContextを破棄しても接続が閉じられることはないため、どこにでも接続が漏れている点を除いて動作します。私はこれが設計によるものだと理解しています。LINQ to SQL、override dispose

私がしたいのは、自分の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メソッド呼び出しの例外は何ですか? –

+0

ObjectDisposedExceptionが発生する – TheNextman

+0

ObjectDisposedExceptionのメッセージは何ですか? – jrummell

答えて

2

問題がDispose(bool)を呼び出す前にDispose()セットdisposedです。これにより、Connectionを呼び出すと例外が発生します。これを回避する方法はないようです。

しかし、これはなぜ必要なのですか? Dispose(bool)Connectionを含むProviderDisposeを呼び出し、自動的にそれを処理する必要があります。

+0

ありがとうございます。リフレクターを見ると、接続は特定の条件の下でのみ処理されるようです(おそらく、Linqが最初にSQLに開いた場合)。 – TheNextman

+0

そして表面的には、少なくとも、Linq to SQLには私が変更できるパブリックプロバイダモデルはないようです。私の回避策が唯一の方法だと思われます。 – TheNextman

+0

@TheNextman:あなたは 'SqlProvider'を使っていますか?それは常に接続を閉じるべきであると思われる。 'conManager'が' null'に設定されているどこかで紛失していない限り(それはブランチの外で構築されます)。 – Guvante