TransactionScope с DapperExtensions?

Я хочу сгруппировать несколько вызовов методов, включающих функции DapperExtensions, в рамках одной транзакции, чтобы я мог откатить их все в случае сбоя любого из них.

Это включает в себя вызовы уже существующих функций, некоторые из которых

  • использовать предикаты DapperExtensions и / или
  • использовать свои собственные соединения.

Ответ должен учитывать как предикатные вызовы, так и несколько соединений в рамках одной транзакции.

Что я пробовал

До сих пор я нашел два подхода, TransactionScope и IDbConnection.

TransactionScope

using (var transactionScope = new TransactionScope())
{
      // Function calls here
     transactionScope.Complete();
}

Хотя это должно быть доступно в.Net Core 2.0, насколько мне известно, оно не поддерживается поддерживаемыми вызовами Dapper и / или DapperExtensions, которые я использую. Запуск этого дает мне следующую ошибку:

 "Enlisting in Ambient transactions is not supported."

Я просмотрел документацию о том, возможно ли это когда-либо, но вышел пустым.

IDbTransaction

Функции предикатов DapperExtensions, кажется, поддерживают это, но пока я не могу найти никаких примеров использования одной и той же транзакции в нескольких соединениях. В нескольких старых сообщениях конкретно говорится, что это "транзакционный подход на основе соединений", поэтому я не уверен, что это возможно.

Я считаю, что документация по DapperExtensions довольно скудная, поэтому, если кто-нибудь может подсказать мне некоторые ссылки на то, как его функции обрабатывают транзакции в целом, это также было бы очень полезно!

2 ответа

Решение

Эта проблема была исправлена ​​в System.Data.SqlClient v4.5,

Вы можете использовать это так.

       using (var sqlConnection = new SqlConnection(configuration.GetConnectionString("DefaultConnection")))
                {
                    sqlConnection.Open();
                    using (var tx = sqlConnection.BeginTransaction())
                    {
                        var model = await sqlConnection.GetListAsync<T>(transaction:tx);
                        return model.ToList();
                    }              
                }
Другие вопросы по тегам