сделки с щеголеватый точка Нэт
Я хотел бы запустить несколько инструкций insert для нескольких таблиц. Я использую dapper.net. я не вижу никакого способа обработки транзакций с помощью dapper.net.
пожалуйста, поделитесь своими идеями о том, как использовать транзакции с dapper.net.
5 ответов:
вот фрагмент кода:
using System.Transactions; .... using (var transactionScope = new TransactionScope()) { DoYourDapperWork(); transactionScope.Complete(); }
обратите внимание, что вам нужно добавить ссылку на
System.Transactions
сборка, потому что по умолчанию на нее нет ссылки.
Я предпочел использовать более интуитивный подход, получая транзакцию непосредственно из соединения:
// This called method will get a connection, and open it if it's not yet open. using (var connection = GetOpenConnection()) using (var transaction = connection.BeginTransaction()) { connection.Execute( "INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction); transaction.Commit(); }
вы должны быть в состоянии использовать
TransactionScope
так как Dapper работает просто ADO.NET командует.using (var scope = new TransactionScope()) { // insert // insert scope.Complete(); }
учитывая все ваши таблицы находятся в одной базе данных, я не согласен с
TransactionScope
решение, предложенное в некоторых ответах здесь. См.этой ответ.
TransactionScope
обычно используется для распределенных транзакций; транзакции, охватывающие разные базы данных, могут находиться в разных системах. Это требует некоторых конфигураций на операционной системе и SQL Server, без которых это не будет работать. Это не рекомендуется, если все ваши запросы от одного экземпляра база данных.
connection.BeginTransaction
синтаксис ADO.NET для осуществления сделки (в C# VB.NET и т. д.) против единой базы данных. Это не работает в нескольких базах данных.и
connection.BeginTransaction()
- Это лучший способ пойти.даже лучший способ обработки транзакции-реализовать UnitOfWork, как описано в этой ответ.
ответ Даниэля сработал, как и ожидалось для меня. Для полноты, вот фрагмент, который демонстрирует фиксацию и откат с помощью области транзакции и dapper:
using System.Transactions; // _sqlConnection has been opened elsewhere in preceeding code using (var transactionScope = new TransactionScope()) { try { long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"}); transactionScope.Complete(); } catch (Exception exception) { // Logger initialized elsewhere in code _logger.Error(exception, $"Error encountered whilst executing SQL: {sqlString}, Message: {exception.Message}") // re-throw to let the caller know throw; } } // This is where Dispose is called