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 ответа
Вы можете использовать это так.
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();
}
}