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();
}
}
オーバーライドDisposeメソッド呼び出しの例外は何ですか? –
ObjectDisposedExceptionが発生する – TheNextman
ObjectDisposedExceptionのメッセージは何ですか? – jrummell