LINQ to SQL, переопределить распоряжение - PullRequest
1 голос
/ 16 февраля 2012

Я создаю LINQ to SQL DataContext, передавая ему уже открытое соединение.Это работает, за исключением того, что я теперь пропускаю соединения повсюду, потому что, хотя я удаляю DataContext, когда я закончил, соединение никогда не закрывается.Я понимаю, что это сделано специально.

Я хотел бы убедиться, что мое соединение закрывается после удаления моего DataContext.

Я попытался переопределить Dispose для DataContext, вот так:

protected override void Dispose(bool disposing)
{
    this.Connection.Close();
}

Однако это не работает ... Я получаю исключение ObjectDisposedException.Установка точки останова показывает, что на этом этапе все уже удалено!

Единственный найденный мной обходной путь - скрыть метод Dispose в DataContext.Вот так:

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

1 Ответ

2 голосов
/ 16 февраля 2012

Проблема в том, что Dispose() устанавливает disposed перед вызовом Dispose(bool). Это вызывает исключение при вызове Connection. Кажется, нет никакого способа обойти это.

Однако я должен спросить, зачем это нужно? Dispose(bool) вызывает Dispose на Provider, который содержит Connection и должен автоматически закрывать его.

...