Вопрос

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

Что я хотел бы сделать, так это убедиться, что мое соединение будет закрыто, как только мой дата -контекст будет утилизироваться.

Я попытался переопределить распоряжение на данных дата -контекста, например:

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

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

Единственный обходной путь, который я обнаружил, - это скрыть метод утилизации в данных 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();
    }
}
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top