C# LINQ到SQL,重写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(); } 然而,这不起作用。。。我得到一

我通过传递一个已经打开的连接来创建一个LINQ到SQL数据上下文。这是可行的,但我现在到处都在泄漏连接,因为尽管我在完成后处理了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):

类程序
{
静态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();
    }
}