2016-10-10 75 views
0

我在尝试调用两个方法并在数据库中执行查询时遇到问题。 这些方法使用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。

回答

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

嘿谢尔盖,我这样做的Dispose方法,所以至少_connectionString不是空的了,所以我能够创建再次连接,没有错误。 – Maturano

相关问题