2016-10-10 1 views
0

J'ai un problème dans mon application lorsque j'essaie d'appeler deux méthodes et que chacune fait une requête dans la base de données. Ces méthodes utilisent l'instruction using pour fermer la connexion après l'utilisation.Dapper, évitant "La propriété de la chaîne de connexion n'a pas été initialisée" erreur

J'ai créé un DapperContext, et je suis en utilisant l'injecteur simple à initialiser, via un constructeur:

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

Pour ouvrir la connexion et faire une requête dans la base de données, j'ai créé une propriété comme ceci:

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

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

     return _connection; 
    } 
} 

Cette DapperContext a une méthode dispose, où il ferme la connexion:

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

    GC.SuppressFinalize(this); 
} 

Dans la classe Repository, il existe une méthode qui exécutera 2 Sqls distincts et ces 2 sqls sont spécifiés chacun dans sa méthode. Fondamentalement, chacun initialise comme ceci:

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

Quand j'appelle la première méthode, la requête fonctionne bien, mais quand le second mehod est appelé, dans la propriété DapperConnection, une erreur se produit dans _connection.Open() , parce que le _connectionString est vide.

Quelle est la meilleure approche pour éviter cette erreur? Je sais que connectionString est en train d'être perdu à cause de la méthode Dispose, mais comme j'utilise SimpleInjector pour créer mon instance et que cela se fait par requête, je n'aurai plus que cette connectionString dans une autre requête.

Répondre

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

Son résultat de "_connection" a fermé l'état de la connexion sans réutilisation. Donc, si vous voulez garder ce code fonctionne alors Éliminez méthode devrait ressembler à:

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

Hey Sergey, je l'ai fait dans la méthode Dispose, donc au moins la _connectionString n'est pas vide plus, donc je suis en mesure de créer la _connection à nouveau sans erreurs. – Maturano