我正在使用dapper和npgsql。 (.net core 3.1)
对于一个连接且在一个事务内的多个connection.Execute(query, params, transaction)
,最后调用This NpgsqlTransaction has completed; it is no longer usable.
时抛出commit()
异常。
在每个sql execute语句上都没有异常。
当我调试代码后,在第一次Execute()调用后,事务的IsCompleted
属性设置为true。
所以我不能在一个事务中多次运行Execute()?
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
}
}
不使用交易时,一切正常,但我需要它
在创建连接之后并在创建事务之前自行添加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);