Dapper, .NET Core 및 트랜잭션 실패

.net-core dapper

문제

Dapper 기반 응용 프로그램을 .NET Core에 포팅하고 트랜잭션 코드에 문제가 있습니다.

우리는 물건을 실행하기 위해 "행동"을 사용합니다.

    public Action<IDbConnection> CreateAction(string statement, object values)
    {
        return (dbConnection) => dbConnection.Execute(statement, values);
    }

그리고 우리는 메소드를 사용하여

    public void Execute(IEnumerable<Action<IDbConnection>> actions)
    {

        using (IDbConnection connection = OpenConnection())
        using (IDbTransaction transaction = connection.BeginTransaction())
        {
            try
            {
                foreach (var action in actions)
                {
                    action(transaction.Connection);
                }
                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
        }
    }

이 기능은 .NET Framework 및 Dapper 1.42에서는 잘 작동하지만 Dapper 1.50.2에서는 .NET Core에서 작동하지 않습니다.

System.InvalidOperationException : 'ExecuteNonQuery 명령에 할당 된 연결이 보류중인 로컬 트랜잭션에있을 때 명령을 트랜잭션이 있어야합니다. 명령의 Transaction 속성이 초기화되지 않았습니다. '

우리가 그것을 사용하여 트랜잭션을 제거하면 잘 작동합니다.

작동 시키려면 무엇을 바꾸어야합니까?

수락 된 답변

이제 우리는 트랜잭션을 명시 적으로 전달해야합니다.

    public void Execute(IEnumerable<Action<IDbConnection, IDbTransaction>> actions)
    {
        using (IDbConnection connection = OpenConnection())
        using (IDbTransaction transaction = connection.BeginTransaction())
        {
            try
            {
                foreach (var action in actions)
                {
                    action(transaction.Connection, transaction);
                }
                transaction.Commit();
            }
            catch
            {
                transaction.Rollback();
                throw;
            }
        }
    }


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.