小巧玲珑,避免“连接字符串属性尚未初始化”错误
问题描述:
我在尝试调用两个方法并在数据库中执行查询时遇到问题。 这些方法使用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 && _connection.State == ConnectionState.Open)
{
_connection.Close();
}
GC.SuppressFinalize(this);
}
在Repository类中,有一个方法将执行2个不同的Sqls,并且在它的方法中每个指定2个sqls。 基本上,每一个初始化这样的:
using (IDbConnection conexao = dapperContext.DapperConnection)
{
... runs a query
}
当我调用的第一个方法中,查询很好地运行,但是当第二mehod被调用时,在DapperConnection属性,一个误差在_connection.Open发生() ,因为_connectionString是空的。
避免此错误的最佳方法是什么?我知道connectionString因Dispose方法而丢失,但由于我使用SimpleInjector来创建我的实例,并且这是通过请求完成的,所以我只会在另一个请求中再次使用此connectionString。
答
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;
}
}
嘿谢尔盖,我这样做的Dispose方法,所以至少_connectionString不是空的了,所以我能够创建再次连接,没有错误。 – Maturano