Dapper, evitando el error "La propiedad connectionstring no se ha inicializado"

asp.net-mvc c# dapper

Pregunta

Tengo un problema en mi aplicación cuando trato de llamar a dos métodos y cada uno hace una consulta en la base de datos. Estos métodos están usando la instrucción using, por lo que cierra la conexión después del uso.

Creé un DapperContext, y estoy usando un inyector simple para inicializar, a través del constructor:

public DapperContext(int idPortal)
{
    _connectionString = GetERPConnectionString(idPortal);
}

Para abrir la conexión y hacer una consulta en la base de datos, creé una propiedad como esta:

public IDbConnection DapperConnection
{
    get
    {
        if (_connection == null)
        {
            _connection = new SqlConnection(_connectionString);                    
        }

        if (_connection.State != ConnectionState.Open)
        {
            _connection.Open();
        }

        return _connection;
    }
}

Este DapperContext tiene un método Dispose, donde cierra la conexión:

public void Dispose()
{
    if (_connection != null && _connection.State == ConnectionState.Open)
    {
        _connection.Close();
    }

    GC.SuppressFinalize(this);
}

En la clase Repository, hay un método que ejecutará 2 Sqls distintos y estos 2 sqls se especifican cada uno en su método. Básicamente, cada uno se inicializa así:

using (IDbConnection conexao = dapperContext.DapperConnection)
{
... runs a query
}

Cuando invoco el primer método, la consulta se ejecuta correctamente, pero cuando se llama al segundo mehod, en la propiedad DapperConnection, ocurre un error en _connection.Open (), porque _connectionString está vacío.

¿Cuál es el mejor enfoque para evitar este error? Sé que connectionString se está perdiendo debido al método Dispose, pero como estoy usando SimpleInjector para crear mi instancia y esto se hace por solicitud, solo tendré este connectionString nuevamente en otra solicitud.

Respuesta aceptada

using (IDbConnection conexao = dapperContext.DapperConnection)
{
}
// -> conexao.Dispose() called on bound out, and _connection.Close(); is closed. 

Es el resultado del estado de conexión cerrado de "_connection" sin uso de reutilización. Entonces, si quiere que este código siga funcionando, el método Dispose debería verse así:

public void Dispose()
{
    if (_connection != null && _connection.State == ConnectionState.Open)
    {
        _connection.Close();
        _connection = null;
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué