2015年10月25日

EntityFramework(12):行の挿入、削除

  
前回、データの更新については、説明しましたので、今回は、行の挿入、削除の例を示します。

行をデータベースに挿入するには 、以下の手順を踏みます。
  1. 送信する列データを含む新しいオブジェクトを作成します。 
  2. データベース内の挿入先テーブルに関連付けられた EntityFramework Table コレク ションに新しいオブジェクトを追加します。 
  3. データベースに変更内容を送信します。 
コードにするとこんな感じ。
 
 using (var db = new NorthwindContext()) {
     Category cat = new Category {
         CategoryName = "Side Dish",
         Description = "salad, croquette, tempura, cooked beans",
     };
     db.Categories.Add(cat);
     db.SaveChanges();
 }

通常のコレクションと同じに Addメソッドで、Categoryを追加しています。
その後、SaveChangesメソッドを呼び出すことで、Categoryを挿入することができます。
なお、CategoryテーブルのCategoryIDは、IDENTITYの指定がされていますので、Categoryクラスのインスタンスを生成するときに、CategoryIDに値を設定する必要はありません。


複数の行をまとめて挿入したい場合には、AddRangeメソッドを使います。

 using (var db = new NorthwindContext()) {
     Category[] categories = new Category[] {
         new Category { CategoryName = "Side Dish", 
                        Description = "salad, croquette, tempura, cooked beans" },
         new Category { CategoryName = "Retort Pack", 
                        Description = "noodles, curry, stew, cooked rice" },
     };
     db.Categories.AddRange(categories);
     db.SaveChanges();
 }
ここでは、配列を渡すコードを示しましたが、AddRangeメソッドは、 IEnumerable<T>を受け取りますので、List<T>なども渡すことができます。



削除するには、いったんテーブルから該当する行を取得し、その後、 Removeメソッドを呼び出します。
 
 using (var db = new NorthwindContext()) {
     var category = (from c in db.Categories
                     where c.CategoryID == 9
                     select c).Single();
     db.Categories.Remove(category);
     db.SaveChanges();
 }

一括して複数の行を削除するには、RemoveRange()メソッドを使います。

 using (var db = new NorthwindContext()) {
     var categories = from c in db.Categories
                      where c.CategoryID >= 9
                      select c;
     db.Categories.RemoveRange(categories);
     db.SaveChanges();
 }

では、取得していないオブジェクト(行)を削除することはできるでしょうか?
試しに以下のコードを書いてみました。
 using (var db = new NorthwindContext()) {
     Category cat = new Category {
         CategoryID = 9,
         CategoryName = "Side Dish",
         Description = "salad, croquette, tempura, cooked beans",
     };
     db.Categories.Remove(cat);
     db.SaveChanges();
 }
実行すると、例外 System.InvalidOperationException が発生します。

実は、この例外を回避して、強制的に削除することもできます。
それには、以下のように Attach()メソッドで、このオブジェクトをDbContextに関連付けしておかなければいけません。

 using (var db = new NorthwindContext()) {
     Category cat = new Category {
         CategoryID = 9
     };
     db.Categories.Attach(cat);
     db.Categories.Remove(cat);
     db.SaveChanges();
 }

クエリ式で読み込んだオブジェクトは、自動的にアタッチされています。
なお、Categoryの主キー以外は設定しておく必要はありません。
発行されるSQLは、以下の通りです。

 DELETE [dbo].[Categories]
 WHERE ([CategoryID] = @0)
 -- @0: '9' (Type = Int32)


 

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

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