Entity Framework - Transação

Em todas as versões do Entity Framework, sempre que você executa SaveChanges()para inserir, atualizar ou excluir o banco de dados, o framework envolverá essa operação em uma transação. Quando você invoca SaveChanges, o contexto inicia automaticamente uma transação e a confirma ou reverte, dependendo se a persistência foi bem-sucedida.

  • Tudo isso é transparente para você e você nunca precisará lidar com isso.

  • Esta transação dura apenas o suficiente para executar a operação e então é concluída.

  • Quando você executa outra operação, uma nova transação é iniciada.

Entity Framework 6 fornece o seguinte -

Database.BeginTransaction ()

  • É um método simples e fácil dentro de um DbContext existente para iniciar e concluir transações para usuários.

  • Ele permite que várias operações sejam combinadas na mesma transação e, portanto, todas são confirmadas ou todas são revertidas como uma.

  • Também permite que o usuário especifique mais facilmente o nível de isolamento da transação.

Database.UseTransaction ()

  • Ele permite que o DbContext use uma transação, que foi iniciada fora do Entity Framework.

Vamos dar uma olhada no exemplo a seguir, onde várias operações são realizadas em uma única transação. O código é 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();
            }

         }
      }
   }
}
  • O início de uma transação requer que a conexão da loja subjacente esteja aberta.

  • Portanto, chamar Database.BeginTransaction () abrirá a conexão, se ainda não estiver aberta.

  • Se DbContextTransaction abriu a conexão, ele a fechará quando Dispose () for chamado.