Entity Framework - Transaction

Dans toutes les versions d'Entity Framework, chaque fois que vous exécutez SaveChanges()pour insérer, mettre à jour ou supprimer la base de données, le framework encapsulera cette opération dans une transaction. Lorsque vous appelez SaveChanges, le contexte démarre automatiquement une transaction et la valide ou la restaure selon que la persistance a réussi.

  • Tout cela est transparent pour vous et vous n'aurez jamais besoin de vous en occuper.

  • Cette transaction ne dure que le temps d'exécuter l'opération, puis se termine.

  • Lorsque vous exécutez une autre opération de ce type, une nouvelle transaction démarre.

Entity Framework 6 fournit les éléments suivants:

Database.BeginTransaction ()

  • C'est une méthode simple et plus facile dans un DbContext existant pour démarrer et terminer des transactions pour les utilisateurs.

  • Il permet à plusieurs opérations d'être combinées dans la même transaction et donc soit toutes sont validées, soit toutes sont annulées en une seule.

  • Il permet également à l'utilisateur de spécifier plus facilement le niveau d'isolement de la transaction.

Database.UseTransaction ()

  • Il permet au DbContext d'utiliser une transaction qui a été démarrée en dehors de Entity Framework.

Jetons un coup d'œil à l'exemple suivant où plusieurs opérations sont effectuées dans une seule transaction. Le code est comme -

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         using (var dbContextTransaction = context.Database.BeginTransaction()) {

            try {

               Student student = new Student() {
                  ID = 200, 
                  FirstMidName = "Ali", 
                  LastName = "Khan", 
                  EnrollmentDate = DateTime.Parse("2015-12-1")
               };

               context.Students.Add(student);

               context.Database.ExecuteSqlCommand(@"UPDATE Course SET Title = 
                  'Calculus'" + "WHERE CourseID = 1045");

               var query = context.Courses.Where(c ⇒ c.CourseID == 1045);

               foreach (var item in query) {
                  Console.WriteLine(item.CourseID.ToString()
                     + " " + item.Title + " " + item.Credits);
               }

               context.SaveChanges();
               var query1 = context.Students.Where(s ⇒ s.ID == 200);

               foreach (var item in query1) {
                  Console.WriteLine(item.ID.ToString() 
                     + " " + item.FirstMidName + " " + item.LastName);
               }

               dbContextTransaction.Commit();
            } catch (Exception) {
               dbContextTransaction.Rollback();
            }

         }
      }
   }
}
  • Le début d'une transaction nécessite que la connexion au magasin sous-jacente soit ouverte.

  • Donc, appeler Database.BeginTransaction () ouvrira la connexion, si elle n'est pas déjà ouverte.

  • Si DbContextTransaction a ouvert la connexion, il la fermera lorsque Dispose () est appelé.