事务中的多个 Dapper Execute() 语句抛出 NpgsqlTransaction 已完成;它不再可用异常

Multiple Dapper Execute() statements inside transaction throws NpgsqlTransaction has completed; it is no longer usable exception

我正在将 dapper 与 npgsql 一起使用。 (.net 核心 3.1)

多个 connection.Execute(query, params, transaction) 用于一个连接并且在一个事务内在最后调用 commit() 时抛出 This NpgsqlTransaction has completed; it is no longer usable. 异常。

每个 sql 执行语句都没有发生异常。

当我调试代码时注意到事务的 IsCompleted 属性 在第一次 Execute() 调用后设置为 true

所以我无法 运行 在一次交易中多次执行()?

using (var connection = new NpgsqlConnection(_connectionString)) {
              connection.Open();
             using (var tr = connection.BeginTransaction()) {
                    foreach (var script in scripts)
                    {
                        try
                        {
                            connection.Execute(script.SqlQuery, script.Params);
                        } 
                        catch (Exception e)
                        {
                            throw; //nothing crashes here
                        }
                    }

                    tr.Commit(); //NpgsqlTransaction has completed; it is no longer usable
                }
}

不使用事务时一切正常,但我需要它


更新

感谢@Marc Gravell 指点我查看已执行的 sql 代码。

我有 DDL 脚本 CREATE TABLE IF NOT EXISTS Name (Column type); END;END; 运算符在这里不是必需的,但它导致交易完成。

在创建连接之后和创建事务之前添加 connection.Open() 自己:

using (var connection = new NpgsqlConnection(_connectionString))
{
    connection.Open();
    using (var tr = connection.BeginTransaction())
    {

通常 Dapper 会在内部处理这个问题,但如果您有多个必须在同一基础连接上的操作,它就不能。


另外:告诉 Dapper 有关交易的信息:

connection.Execute(script.SqlQuery, script.Params, transaction: tr);