Commandes UPDATE atomiques personnalisées dans SaveChanges ()

c# dapper entity-framework savechanges transactions

Question

Pour diverses raisons, je dois pouvoir SaveChanges plusieurs commandes SQL UPDATE personnalisées lorsque j'appelle SaveChanges sur un DbContext . Je veux que cela se produise de manière atomique, soit que les deux SaveChanges réguliers et le SQL réussissent, soit aucun des deux.

Je ne sais pas comment accomplir cela cependant. Ce que j'ai essayé jusqu'à présent, c'est ceci et diverses variations:

Transactions EF - Gist

L'erreur est ici (sur l'appel ExecuteSqlCommand ):

ExecuteNonQuery nécessite que la commande ait une transaction lorsque la connexion affectée à la commande est dans une transaction locale en attente.

D'accord, d'accord. La commande ExecuteSqlCommand n'a pas de surcharge qui accepte une transaction. J'ai donc installé le package Dapper et remplacé la ligne incriminée par cet appel Dapper et j'ai passé la transaction:

this.Database.Connection
  .Execute("insert into Tests (Foo, Bar) values ('test', 2)", 
  transaction: tran);

mais maintenant l'erreur se produit sur base.SaveChanges() et cela me donne ce qui suit:

SqlConnection ne prend pas en charge les transactions parallèles.

Donc, apparemment, SaveChanges crée toujours une nouvelle transaction même si j'en ai déjà créé une sur la connexion du contexte de données?

Y a-t-il un moyen d'accomplir ce que je veux?

J'utilise d'abord le code Entity Framework 5.0.

Réponse acceptée

Enroulez un TransactionScope autour de toutes les opérations. Cette classe est l'abstraction commune pour les transactions .NET. EF et SqlConnection s'enrôleront automatiquement. Assurez-vous de rechercher les meilleures pratiques, car il existe des pièges, comme le déclenchement accidentel de transactions distribuées.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi