Entity Framework - Transacción

En todas las versiones de Entity Framework, siempre que ejecute SaveChanges()para insertar, actualizar o eliminar la base de datos, el marco envolverá esa operación en una transacción. Cuando invoca SaveChanges, el contexto inicia automáticamente una transacción y la confirma o revierte dependiendo de si la persistencia tuvo éxito.

  • Todo esto es transparente para ti y nunca tendrás que lidiar con eso.

  • Esta transacción solo dura lo suficiente para ejecutar la operación y luego se completa.

  • Cuando ejecuta otra operación de este tipo, comienza una nueva transacción.

Entity Framework 6 proporciona lo siguiente:

Database.BeginTransaction ()

  • Es un método simple y más fácil dentro de un DbContext existente para iniciar y completar transacciones para los usuarios.

  • Permite que se combinen varias operaciones dentro de la misma transacción y, por lo tanto, todas se confirman o todas se deshacen como una.

  • También permite al usuario especificar más fácilmente el nivel de aislamiento para la transacción.

Database.UseTransaction ()

  • Permite que DbContext use una transacción, que se inició fuera de Entity Framework.

Echemos un vistazo al siguiente ejemplo donde se realizan múltiples operaciones en una sola transacción. El código es como -

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();
            }

         }
      }
   }
}
  • Comenzar una transacción requiere que la conexión de la tienda subyacente esté abierta.

  • Entonces, llamar a Database.BeginTransaction () abrirá la conexión, si aún no está abierta.

  • Si DbContextTransaction abrió la conexión, la cerrará cuando se llame a Dispose ().