C# LINQ到SQL,重写dispose
我通过传递一个已经打开的连接来创建一个LINQ到SQL数据上下文。这是可行的,但我现在到处都在泄漏连接,因为尽管我在完成后处理了DataContext,但连接从未关闭。我知道这是故意的 我想做的是确保在释放DataContext后关闭连接 我已尝试覆盖DataContext上的Dispose,如下所示:C# LINQ到SQL,重写dispose,c#,linq-to-sql,dispose,idisposable,objectdisposedexception,C#,Linq To Sql,Dispose,Idisposable,Objectdisposedexception,我通过传递一个已经打开的连接来创建一个LINQ到SQL数据上下文。这是可行的,但我现在到处都在泄漏连接,因为尽管我在完成后处理了DataContext,但连接从未关闭。我知道这是故意的 我想做的是确保在释放DataContext后关闭连接 我已尝试覆盖DataContext上的Dispose,如下所示: protected override void Dispose(bool disposing) { this.Connection.Close(); } 然而,这不起作用。。。我得到一
protected override void Dispose(bool disposing)
{
this.Connection.Close();
}
然而,这不起作用。。。我得到一个ObjectDisposedException。设置断点向我显示,此时已处理所有内容 我发现的唯一解决方法是隐藏DataContext上的Dispose方法。像这样:
public new void Dispose()
{
this.Connection.Close();
base.Dispose();
}
然而,这对我来说有点不好的代码味道。在这里,推荐的方法是什么
完整的代码示例(DataClasses1DataContext为空DataContext):
类程序
{
静态void Main(字符串[]参数)
{
string connectionString=“server=localhost;initial catalog=master;Integrated Security=SSPI;”;
对于(int i=0;i<100;i++)
{
var connection=newsqlconnection(connectionString);
connection.Open();
var ctx=新的DataClasses1DataContext(连接);
ctx.ExecuteCommand(“声明@i int”);
ctx.Dispose();
}
Console.ReadKey();
}
}
公共部分类DataClasses1DataContext
{
受保护的覆盖无效处置(布尔处置)
{
//这将抛出ObjectDisposedException
//this.Connection.Close();
}
公开新的无效处置()
{
//这会奏效的
//this.Connection.Close();
//base.Dispose();
}
}
问题是Dispose()
在调用Dispose(bool)
之前设置disposed
。这会在调用连接时导致异常。似乎没有办法解决这个问题
不过,我要问,为何要这样做<代码>处置(bool)
在提供程序
上调用Dispose
,该提供程序包含连接
,并应处理自动关闭该连接。重写Dispose方法调用的异常是什么?我得到一个ObjectDisposedException ObjectDisposedException的消息是什么?类型的未处理异常System.Data.Linq.dll中出现“System.ObjectDisposedException”其他信息:无法访问已处置对象。在我隐藏Dispose(bool disposing)重写时,连接对象,实际上是所有上下文属性,都已被处置。因为Dispose()方法是先调用的…谢谢。从reflector来看,连接似乎只在某些条件下进行处理(可能,如果它首先由Linq to SQL打开的话)。而且,至少从表面上看,Linq to SQL似乎没有一个我可以更改的公共提供程序模型。似乎我的解决方法是唯一的方法。@下一个问题:您使用的是SqlProvider
?似乎它应该始终关闭连接。除非我缺少conManager
设置为null
(它是在分支外部构造的)的某个地方。在Reflector中阅读代码后,我不清楚。但是,文档(通过在使用SQLServer:General Statistics:User Connections performance counter时运行示例代码进行备份)表明,如果您为Linq to SQL提供一个已经打开的连接,或者自己打开它的连接对象,经过进一步调查后,它不会在销毁中处理/关闭连接:如果您使用连接字符串构造DataContext,L2S将处理该连接。如果使用连接构造,它将不会处理它。有道理:)
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();
}
}