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();
    }
}

LINQ to SQL, override dispose

问题是Dispose()在调用Dispose(bool)之前设置了disposed。这会在调用Connection时导致异常。似乎没有办法解决这个问题。

然而,我不得不问,为什么这是必要的?Dispose(bool)在包含ConnectionProvider上调用Dispose,并应自动处理其关闭。