Dapper,避免“连接字符串属性未初始化”错误

4

当我尝试调用两个方法并且每个方法都在数据库中进行查询时,我的应用程序出现了问题。

这些方法使用了using语句,所以在使用后关闭了连接。

我创建了一个DapperContext,并通过构造函数使用simple injector进行初始化:

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 && _connection.State == ConnectionState.Open)
    {
        _connection.Close();
    }

    GC.SuppressFinalize(this);
}

在Repository类中,有一种方法将执行2个不同的Sql,并且这两个Sql分别在它们自己的方法中指定。基本上,每一个都像这样初始化:
using (IDbConnection conexao = dapperContext.DapperConnection)
{
... runs a query
}

当我调用第一个方法时,查询运行得很好,但是当调用第二个方法时,在DapperConnection属性中,在_connection.Open()中发生错误,因为_connectionString为空。最好的方法是什么?我知道由于Dispose方法,connectionString丢失了,但是由于我使用SimpleInjector创建我的实例,并且这是按请求执行的,所以我只会在另一个请求中再次拥有这个connectionString。
1个回答

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

这是由于“_connection”关闭了连接状态,并且没有重用。因此,如果您想使此代码正常工作,则Dispose方法应如下所示:

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

2
嘿,Sergey,我在Dispose方法中做了这件事,所以至少_connectionString不再为空,因此我能够再次创建_connection而没有错误。 - Maturano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接