2015年11月22日

EntityFramework(19):楽観的同時実行制御 (Timestamp列あり)

  
EntityFrameworkでは、楽観的同時実行制御の仕組みが組み込まれています。
もっとも簡単な方法は、Timestamp型/rowversion型のカラムをテーブルに用意することです。
Database Firstの場合、Timestamp型/rowversion型のカラムがある場合は、 Visual Studioが自動生成するエンティティクラスに以下のようなプロパティが 生成されます。

        [Column(TypeName = "timestamp")]
        [MaxLength(8)]
        [Timestamp]
        public byte[] RowVersion { get; set; }

※ これは、カラム名を RowVersionとして定義した場合の例です。

あとは、EntityFrameworkが自動でたとえば、楽観的同時実行制御のためのSQLを発行してくれます。

例えば、以下のコードを例に取ると、

 using (var db = new NorthwindContext()) {
     try {
         db.SetLogging();
         Category cat = db.Categories.First(x => x.CategoryName == "Produce");
         cat.CategoryName = "UpdatedCategory";
         db.SaveChanges();
     } catch (DbUpdateConcurrencyException ex) {
         Console.WriteLine(ex.ToString());
     }
 }

Categoriesテーブルに RowVersion列がある場合、 以下のような UPDATE文を発行します。

UPDATE [dbo].[Categories]
SET [CategoryName] = @0
WHERE (([CategoryID] = @1) AND ([RowVersion] = @2))

パラメータ p1, p2... には、変更前の値が渡されます。
これによって、RowVersion列が取得した値ではない値に更新されていた場合は、DbUpdateConcurrencyException 例外が発生します。
 


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52440876