我正在通过传递一个已经打开的连接来创建一个LINQ to SQL DataContext。这是有效的,除非我现在在各处泄漏连接,因为尽管我在完成时处理DataContext,但连接永远不会关闭。我明白这是设计。LINQ to SQL,重写处理
我想要做的是确保我的连接在我的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方法调用的异常是什么? – 2012-02-16 14:40:32
我得到一个ObjectDisposedException – TheNextman 2012-02-16 14:41:38
什么是ObjectDisposedException的消息? – jrummell 2012-02-16 14:48:06