Entity Framework - Транзакция

Во всех версиях Entity Framework всякий раз, когда вы выполняете SaveChanges()чтобы вставить, обновить или удалить базу данных, фреймворк заключит эту операцию в транзакцию. Когда вы вызываете SaveChanges, контекст автоматически запускает транзакцию и фиксирует или откатывает ее в зависимости от того, удалось ли сохранить сохранение.

  • Все это прозрачно для вас, и вам никогда не придется с этим сталкиваться.

  • Эта транзакция длится достаточно долго, чтобы выполнить операцию, а затем завершается.

  • Когда вы выполняете другую такую ​​операцию, начинается новая транзакция.

Entity Framework 6 предоставляет следующее:

Database.BeginTransaction ()

  • Это простой и легкий метод в существующем DbContext для запуска и завершения транзакций для пользователей.

  • Это позволяет объединить несколько операций в одной транзакции, и, следовательно, либо все фиксируются, либо все откатываются как одна.

  • Это также позволяет пользователю более легко указать уровень изоляции для транзакции.

Database.UseTransaction ()

  • Это позволяет DbContext использовать транзакцию, которая была запущена вне Entity Framework.

Давайте посмотрим на следующий пример, в котором несколько операций выполняются в одной транзакции. Код такой -

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

         }
      }
   }
}
  • Для начала транзакции необходимо, чтобы соединение с базовым магазином было открыто.

  • Таким образом, вызов Database.BeginTransaction () откроет соединение, если оно еще не открыто.

  • Если DbContextTransaction открыл соединение, он закроет его при вызове Dispose ().