Dapper, избегающий ошибки «Свойство connectionstring не было инициализировано»

#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 без ошибок.