为什么平时Dapper会自动打开这个.NET Core数据库连接,需要手动打开?

Why do I need to manually open this .NET Core database connection when usually Dapper auto opens it?

我正在尝试使用 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 { .. });
}

异常:

Message: System.InvalidOperationException : Invalid operation. The connection is closed.

但是当我将代码更改为以下内容时,它起作用了:

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

类似的 SO 问题:

Dapper 为您打开连接;但它也会在工作完成后关闭它。

现在,您是 运行 使用一个连接的两个独立 async 任务。

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

两项任务同时运行。当一项任务的工作完成时,它会关闭连接。但是其他任务仍然是 运行,它无法再访问打开的连接,因此出现了您提到的异常。

如您所说,如果您自己打开连接,Dapper 不会关闭它,一切正常。

顺便说一句,在并发使用连接实例时,可能会出现意想不到的问题。详情请参考this问题。