#c# #asp.net-mvc #dapper
#c# #asp.net-mvc #dapper
Вопрос:
У меня проблема в моем приложении, когда я пытаюсь вызвать два метода, и каждый из них выполняет запрос в базе данных. Эти методы используют оператор using, поэтому он закрывает соединение после использования.
Я создал DapperContext и использую простой инжектор для инициализации через конструктор:
public DapperContext(int idPortal)
{
_connectionString = GetERPConnectionString(idPortal);
}
Чтобы открыть соединение и выполнить запрос в базе данных, я создал свойство, подобное этому:
public IDbConnection DapperConnection
{
get
{
if (_connection == null)
{
_connection = new SqlConnection(_connectionString);
}
if (_connection.State != ConnectionState.Open)
{
_connection.Open();
}
return _connection;
}
}
Этот DapperContext имеет метод Dispose, в котором он закрывает соединение:
public void Dispose()
{
if (_connection != null amp;amp; _connection.State == ConnectionState.Open)
{
_connection.Close();
}
GC.SuppressFinalize(this);
}
В классе репозитория есть метод, который будет выполнять 2 разных SQLL, и каждый из этих 2 sqll указан в его методе.
По сути, каждый из них инициализируется следующим образом:
using (IDbConnection conexao = dapperContext.DapperConnection)
{
... runs a query
}
Когда я вызываю первый метод, запрос выполняется нормально, но при вызове второго метода в свойстве DapperConnection в _connection возникает ошибка.Open(), потому что _connectionString пуста.
Каков наилучший подход, чтобы избежать этой ошибки? Я знаю, что строка подключения теряется из-за метода Dispose, но поскольку я использую SimpleInjector для создания своего экземпляра, и это делается по запросу, у меня будет только эта строка подключения снова в другом запросе.
Ответ №1:
using (IDbConnection conexao = dapperContext.DapperConnection)
{
}
// -> conexao.Dispose() called on bound out, and _connection.Close(); is closed.
Его результат состояния закрытого соединения «_connection» без повторного использования. Итак, если вы хотите, чтобы этот код работал, тогда метод Dispose должен выглядеть так:
public void Dispose()
{
if (_connection != null amp;amp; _connection.State == ConnectionState.Open)
{
_connection.Close();
_connection = null;
}
}
Комментарии:
1. Привет, Сергей, я сделал это в методе Dispose, так что, по крайней мере, строка _connectionString больше не пуста, поэтому я смог снова создать _connection без ошибок.