Je voudrais exécuter plusieurs instructions d'insertion sur plusieurs tables. J'utilise dapper.net. Je ne vois aucun moyen de gérer les transactions avec dapper.net.
Veuillez partager vos idées sur la façon d'utiliser les transactions avec dapper.net.
c#
transactions
dapper
Amit
la source
la source
Dispose()
méthode. S'ilComplete()
n'a pas été appelé, la transaction est annulée.TransctionScope
bloc using au cas où vous choisiriez cette réponse.J'ai préféré utiliser une approche plus intuitive en récupérant la transaction directement depuis la connexion:
la source
.BeginTransaction()
? Si tel était le cas, cette méthode d'extension favoriserait une mauvaise utilisation de la transaction. (OMI, il devrait même lancer "Execute
, car cela est nécessaire.Vous devriez pouvoir l'utiliser
TransactionScope
car Dapper n'exécute que des commandes ADO.NET.la source
Étant donné que toutes vos tables sont dans une seule base de données, je ne suis pas d'accord avec la
TransactionScope
solution suggérée dans certaines réponses ici. Reportez - vous cette réponse.TransactionScope
est généralement utilisé pour les transactions distribuées; la transaction couvrant différentes bases de données peut être sur un système différent. Cela nécessite certaines configurations sur le système d'exploitation et SQL Server sans lesquelles cela ne fonctionnera pas. Cela n'est pas recommandé si toutes vos requêtes concernent une seule instance de base de données.Mais, avec une base de données unique, cela peut être utile lorsque vous devez inclure le code dans une transaction qui n'est pas sous votre contrôle. Avec une base de données unique, il n'a pas non plus besoin de configurations spéciales.
connection.BeginTransaction
est la syntaxe ADO.NET pour implémenter une transaction (en C #, VB.NET, etc.) sur une seule base de données. Cela ne fonctionne pas sur plusieurs bases de données.Alors,
connection.BeginTransaction()
c'est la meilleure façon de procéder.Même la meilleure façon de gérer la transaction consiste à implémenter UnitOfWork comme expliqué dans cette réponse.
la source
TransactionScope
ce qui est inefficace pour ce que veut OP. Je reconnais queTransactionScope
c'est un bon outil dans de nombreux cas; mais pas ça.La réponse de Daniel a fonctionné comme prévu pour moi. Pour être complet, voici un extrait de code qui montre la validation et la restauration à l'aide d'une portée de transaction et d'un dapper:
la source
Dispose
méthode est appelée en premier ou en deuxième, juste qu'elle est appelée deux fois. Quant au fait que "appeler à disposer une deuxième fois n'est pas nuisible", c'est une grande hypothèse. J'ai appris que les documents et les implémentations réelles ne sont souvent pas d'accord. Mais si vous voulez le mot de Microsoft pour cela: msdn.microsoft.com/en-us/library