Мне нужна помощь, чтобы лучше понять, как Dapper обрабатывает соединения с БД и почему соединение с БД не удаляется должным образом. Я закодировал различные возможные случаи. В моем коде я проверяю, имеет ли _connection значение null, и соответственно создаю новое соединение. Выполняя запросы, я обнаружил, что иногда соединение остается открытым, а в других случаях я обнаруживаю, что строка подключения отсутствует в объекте (что делает его непригодным для использования, но не устанавливает для него значение NULL). Я обрабатываю эти случаи соответствующим образом, но хотел бы понять, почему соединение имеет эти различные состояния и не удаляется, даже если клиентский код явно реализует оператор using для обертывания кода. Это обработка соединений ADO.net, есть ли побочный эффект Dapper или просто проблемы с моим кодом?
Код управления подключением
public class DatabaseContext : IDatabaseContext
{
private readonly string _connectionString;
private DbConnection _connection;
public DatabaseContext(string connectionString)
{
_connectionString = connectionString;
}
public IDbConnection Connection
{
get
{
if (_connection == null)
_connection = new SqlConnection(_connectionString);
if (string.IsNullOrEmpty(_connection.ConnectionString))
_connection.ConnectionString = _connectionString;
if (_connection.State != ConnectionState.Open)
_connection.Open();
return _connection;
}
}
}
Код клиента
public IEnumerable<PostSearResults> Search(SearchPostsBy searchPostsBy)
{
DynamicParameters param;
var sql = GetSearchSql(searchPostsBy,out param);//Gets SQL
using (var connection = _databaseContext.Connection)
{
var posts = connection.Query<PostSearResults>(sql, param);
return posts.ToList();
}
}