Entity-framework-transaction

提供:Dev Guides
移動先:案内検索

Entity Framework-トランザクション

Entity Frameworkのすべてのバージョンでは、* SaveChanges()*を実行してデータベースを挿入、更新、または削除すると、フレームワークはその操作をトランザクションでラップします。 SaveChangesを呼び出すと、永続性が成功したかどうかに応じて、コンテキストがトランザクションを自動的に開始し、コミットまたはロールバックします。

  • これはすべて透過的であり、対処する必要はありません。
  • このトランザクションは操作を実行するのに十分な長さだけ持続し、その後完了します。
  • このような別の操作を実行すると、新しいトランザクションが開始されます。

Entity Framework 6は以下を提供します-

Database.BeginTransaction()

  • これは、ユーザーのトランザクションを開始および完了するための既存のDbContext内のシンプルで簡単な方法です。
  • 同じトランザクション内で複数の操作を組み合わせることができるため、すべてがコミットされるか、すべてが1つのロールバックされます。
  • また、ユーザーはトランザクションの分離レベルをより簡単に指定できます。

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()が呼び出されたときに接続を閉じます。