すでに開いている接続を渡すことで、LINQ toSQLDataContextを作成しています。これは機能しますが、終了時にDataContextを破棄しても、接続が閉じられることはないため、どこでも接続がリークされています。これは仕様によるものだと理解しています。
私がやりたいのは、DataContextが破棄されたら、接続が確実に閉じられるようにすることです。
次のように、DataContextでDisposeをオーバーライドしようとしました。
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();
}
}