LINQ в SQL, переопределить утилизацию
-
26-10-2019 - |
Вопрос
Я создаю 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
и должен обрабатывать его автоматически.