2015年11月11日

EntityFramework(16):IDENTITY列の扱い

  
今回はIDENTITY列についてです。

プロパティに "ID" (大文字と小文字の区別なし) という名前が付いていて、型が数値の場合、EntityFrameworkは、そのプロパティが主キーであると認識します。 かつ、IDENTITY列として扱ってくれます。
「データベースからCode First」を利用する場合、このあたりはほとんど意識する 必要はありません。
自分でPOCOクラスを定義する場合で、IDという名前が付かない場合は、

[DatabaseGenerated(DatabaseGenerationOption.Identity)] 
public int CustomerCode { get; set; }

などと、DatabaseGenerated 注釈をつけてあげる必要があるみたいです。

このIDENTITY列の値は、行を挿入した時に割り振られるわけですが、 どうやってC#のコード側でこの値を把握するのか、これも実に簡単です。

 using (var db = new NorthwindContext()) {
     Category cat = new Category { CategoryName = "New Category" };
     //Product product = new Product { ProductName = "New Product", Category = cat };
     db.Categories.Add(cat);
     db.SaveChanges();
     Console.WriteLine($"CategoryID={cat.CategoryID}");
 }

あるいは、以下のように書くこともできます。

 using (var db = new NorthwindContext()) {
     Category cat = new Category { CategoryName = "New Category" };
     //Product product = new Product { ProductName = "New Product", Category = cat };
     var newcat = db.Categories.Add(cat);
     db.SaveChanges();
     Console.WriteLine($"CategoryID={newcat.CategoryID}");
 }

Add()メソッドの戻り値を利用すれば、メソッドチェインさせることもできます。

どんなSQL文が発行されるのかを確認してみました。

INSERT [dbo].[Categories]([CategoryName], [Description], [Picture])
VALUES (@0, NULL, NULL)
SELECT [CategoryID]
FROM [dbo].[Categories]
WHERE @@ROWCOUNT > 0 AND [CategoryID] = scope_identity()

-- @0: 'New Category' (Type = String, Size = 15)

わずらわしいSQL文のコーディングから解放されるのは、とても嬉しいですね。


 

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

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