我通过将一个已经打开的连接传递给它来创建一个 LINQ to SQL DataContext。这可行,除了我现在到处泄漏连接,因为虽然我在完成后处理了 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();
}
}