LINQ to SQL, override dispose
本文关键字:override dispose SQL to LINQ | 更新日期: 2023-09-27 18:24:45
我正在通过向它传递一个已经打开的连接来创建一个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();
}
}
问题是Dispose()
在调用Dispose(bool)
之前设置了disposed
。这会在调用Connection
时导致异常。似乎没有办法解决这个问题。
然而,我不得不问,为什么这是必要的?Dispose(bool)
在包含Connection
的Provider
上调用Dispose
,并应自动处理其关闭。