Почему мне нужно вручную открывать это соединение с базой данных .NET Core, когда обычно Dapper auto открывает его? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь использовать async / await для вставки нескольких записей в базу данных.Если я не открываю соединение вручную, я получаю Exception.Если я добавлю некоторый код для открытия соединения, то все будет нормально.

Вот текущий код (который выдает исключение):

using (var connection = new SqlConnection(ConnectionString))
{
    var tasks = new List<Task>();
    soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url))); 
    rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));
    await Task.WhenAll(tasks);
}

...

private async Task InsertUrlAsync(IDbConnection connection, string url)
{
    const string query = "INSERT INTO ..";
    return await connection.ExecuteAsync(query, new { .. });
}

исключение:

Сообщение: System.InvalidOperationException: недопустимая операция.Соединение закрыто.

, но когда я изменяю код на следующий, это работает:

var tasks = new List<Task>();
await connection.OpenAsync();
soldUrls.ForEach(....) .. etc ... 

Подобные вопросы SO:

1 Ответ

2 голосов
/ 10 июля 2019

Dapper открывает соединение для вас;но он также закрывает его, когда работа завершена.

Теперь вы выполняете две независимые async задачи, используя одно соединение.

soldUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url))); 
rentUrls.ForEach(url => tasks.Add(InsertUrlAsync(connection, url)));

Обе задачиработают одновременно.Когда работа одной задачи завершена, она закрывает соединение.Но все еще выполняется другая задача, которая больше не имеет доступа к открытому соединению и, следовательно, исключение, которое вы упомянули в вопросе.

Как вы сказали, если вы открываете соединение самостоятельно, Dapper не закрывает его, и все просто работаетнормально.

Кстати, при одновременном использовании экземпляра соединения могут возникнуть непредвиденные проблемы.Пожалуйста, обратитесь к этому вопросу для получения более подробной информации.

...