2015年10月21日

EntityFramework(11):エンティティオブジェクトへの操作

  
今回は、更新、挿入、削除の操作の基礎となるエンティティオブジェクトの操作について。

早速、以下のコードを見てください。

 using (var db = new NorthwindContext()) {
     var p = db.Products.Where(x => x.ProductID == 5).SingleOrDefault();
     if (p != null) {
         Console.WriteLine("{0} {1}", p.ProductID, p.UnitPrice); // ★
         // 値を変更
         p.UnitPrice = 20.5m;   
         // 再度取り出し。
         var p2 = db.Products.Where(product => product.ProductID == 5).Single();
         Console.WriteLine($"{p2.ProductID} {p2.UnitPrice}");
     }
 }

取得した ProductオブジェクトのUnitPriceプロパティの値を更新後、再度クエリを実行しています。 このコードを実行すると、コンソールには、
5 21.3500
5 20.5

と表示されます。
UnitPriceプロパティに値を代入した後に、NorthwindContextオブジェクトから再度データを取得すると、変更前の値ではなく、変更後の値が取得されます。
これは、EntityFrameworkが変更を追跡しており、自動的にDbContextと同期が取れるようになっているのです。
ただ注意しなければならないのは、まだ、DBへの更新は行われていいないということです。 試しに、using ブロックの後に、以下のコードを続けて実行すると、

 using (var db = new NorthwindContext()) {
     var p = db.Products.Where(x => x.ProductID == 5).SingleOrDefault();
     if (p != null) {
        Console.WriteLine($"{p2.ProductID} {p2.UnitPrice}"); // ★
     }
 }

変更したはずの値ではなく、変更前の値 21.3500 が表示されまます。
実際に、データベースに対して更新を行うには、SaveChanges メソッドを呼び出す必要があります。

 using (var db = new NorthwindContext()) {
     var p = db.Products.Where(x => x.ProductID == 5).SingleOrDefault();
     if (p != null) {
          p.UnitPrice = 20.5m; 
          db.SaveChanges();  // これで変更がDBに反映される。
     }
 }
 
以下の行を追加してみれば、UPDATE文が発行されているのが確認できるはずです。
 
 db.SetLogging();

関連テーブルも同様の方法で更新が可能です。SetLoggingメソッドは以前お見せしたメソッド。

 using (var db = new NorthwindContext()) {
     var prod = db.Products.Where(p => p.ProductID == 34).Single();
     var cat = db.Categories.Where(c => c.CategoryID == 3).Single();
     prod.Category = cat;
     db.SaveChanges();
 }

このコードは、製品のカテゴリを変更するコードです。具体的には

 1). ProductID == 34 のProductを取り出す
 2). CategoryId == 3 のCategoryを取り出す
 3). 取り出したCategoryを、1)で取り出した ProductのCategoryにセットする。

ということをやっています。 prod.CategoryID の値の変更はやっていませんが、この変更はEentityFrameworkが自動でやってくれます。
SaveChanges() は、メモリ内で行ったすべての変更を同等の SQL コマンドに変換し、対応するテーブルに対し、挿入、更新、削除を行います。
挿入、削除の方法については、次回に持ち越します。

▪️おまけ
ConsoleアプリケーションやWindowsFormsアプリケーションの場合、Visual Studio からデバッグ実行すると、Northwind.mdfは、毎回、デバッグ実行の出力フォルダにコピーされることになります。
プログラムで行ったデータベースへの更新は、出力フォルダーにコピーされたデータベースに対して更新が行われます。 そのため、更新、削除、挿入したとしても、再度プログラムを実行すると、変更前の状態のデータベースに対する処理となりますので、デバッグがしやすくなっています。
なお、サーバーエクスプローラに表示されている NORTHWND.MDFは、プロジェクトフォルダにあるNORTHWND.MDFですので、デバッグ実行後に、このNORTHWND.MDFの内容を確認しても、プログラムで変更した内容は反映されていませんので注意してください。


 

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

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