2016-10-10 3 views
0

У меня проблема в моем приложении, когда я пытаюсь вызвать два метода, и каждый из них выполняет запрос в базе данных. Эти методы используют оператор using, поэтому он закрывает соединение после использования.Dapper, избегая «Не удалось инициализировать свойство connectionstring»

Я создал 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); 
} 

В классе Репозитория существует метод, который будет выполнять 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. 

Его результат «закрытого состояния соединения» без использования повторного использования. Итак, если вы хотите сохранить этот код работает, то Dispose метод должен выглядеть так:

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

Эй Сергей, я сделал это в методе Dispose, так, по крайней мере _connectionString не пусто больше, так что я был в состоянии создать _соединение снова без ошибок. – Maturano