0 votes

Quelle est la bonne façon de faire des transactions explicites avec linq to sql ?

J'ai quelques scénarios où j'ai besoin d'avoir plusieurs appels à .SubmitChanges() sur un datacontext, mais je veux explicitement contrôler la transaction moi-même pour la rendre atomique. Pendant un certain temps, j'ai fait cela en créant une connexion, en créant une transaction sur cette connexion, puis en créant le datacontext et en lui passant les deux. Supposons pour l'instant que je ne veuille pas utiliser TransactionScope à la place. Mon code ressemble à ceci :

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Using trans = conn.BeginTransaction()
      Dim dc as new DataContext(conn)
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

J'ai commencé à utiliser le profileur Linq To SQL et il casse ce code. Pour une raison quelconque, il exige que vous utilisiez la propriété .Connection sur le datacontext pour créer la transaction. Il échoue si vous utilisez la variable de connexion directement (ce qui me semble idiot). Ma question est de savoir s'il est plus approprié de procéder de cette manière :

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Dim dc as new DataContext(conn)
   Using trans = dc.Connection.BeginTransaction()
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

Quelle est la méthode la plus largement acceptée ?

0voto

Steven Points 56939

Le deuxième extrait ne me semble pas approprié. Avec le deuxième extrait, vous devez créer la transaction après créer le contexte, ce qui est - au moins - moins utile du point de vue de la lisibilité et de la maintenabilité. J'essaie d'imaginer à quoi ressemblerait votre code lorsque vous avez besoin de créer deux DataContext et créer la transaction (uniquement) après avoir créé le premier contexte. Il est donc difficile de conserver un code séparé propre.

Je pense que vous devriez envoyer un mail à Hibernating Rhinos pour leur demander de corriger ce bug.

-1voto

Raj Kaimal Points 7133
Product prod = db.Products.Single(p => p.ProductID == 15);

if (prod.UnitsInStock > 0)
   prod.UnitsInStock--;

using(TransactionScope ts = new TransactionScope()) {
   db.SubmitChanges();
   ts.Complete();
}

http://msdn.microsoft.com/en-us/library/bb425822.aspx

-1voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X