2015年11月01日

EntityFramework(13):リレーションのあるエンティティの更新、挿入

  
前回はあまりにも単純な例でしたが、実際はテーブル間にはリレーションが張られています。リレーションが張られているテーブルについてみていきます。

Productsテーブルに新しい行を挿入する場合を考えてみます。Productのは、どのカテゴリに属するかを示すCategoryIdがあり、これがCategoriesテーブルの外部キーとなています。
このategoryIdに値を設定する必要があります。Entity Frameworkにおいても、これは同じです。 Productsテーブルに行を挿入するコードを示します。

 using (var db = new NorthwindContext()) {
     Product product = new Product {
         ProductName = "New Product",
         CategoryID = 1,
         UnitPrice = 10,
     };
     db.Products.Add(product);
     db.SaveChanges();
 }

実際に更新されたのかを確認するコードも書いてみます。上のコードの直後に 次のコードを挿入します。

 using (var db = new NorthwindContext()) {
     var q = db.Products.Where(x => x.ProductName == "New Product");
     foreach (var p in q) {
         var s = $"{p.ProductID}, {p.ProductName}, {p.CategoryID}, {p.Category.CategoryName}";
         Console.WriteLine(s);
     }
 }

以下のような結果を得ることができます。
 78, New Product, 1, Beverages


CategoryID に直接値を設定するのではなく、ProductのCategoryプロパティを設定することでも同じことができます。

 using (var db = new NorthwindContext()) {
     Category cat = db.Categories.First(x => x.CategoryName == "Seafood");
     Product product = new Product() {
         ProductName = "New Product",
         Category = cat
     };
     db.Products.Add(product);
     db.SaveChanges();
 }


また、Categoryテーブルに、Productを追加することで同様のことを実現できます。 上と似たようなコードですが、主従が逆転しているのがわかると思います。

 using (var db = new NorthwindContext()) {
     Category cat = db.Categories.First(x => x.CategoryName == "Seafood");
     Product product = new Product() {
         ProductName = "New Product",
     };
     cat.Products.Add(product);
     db.SaveChanges();
 }

最後に、Category とProductを同時に挿入するコードを示します。
 using (var db = new NorthwindContext()) {
     Category cat = new Category {
         CategoryName = "New Category"
     };
     Product product = new Product {
         ProductName = "New Product",
         Category = cat
     };
     db.Products.Add(product);
     db.SaveChanges();
 }


挿入した行を読み込むコードも書いてみます。

 using (var db = new NorthwindContext()) {
     var q = db.Products.Where(x => x.ProductName == "New Product");
     foreach (var p in q) {
         var s = $"{p.ProductID}, {p.ProductName}, {p.CategoryID}, {p.Category.CategoryName}";
         Console.WriteLine(s);
     }
 }

結果。
78, New Product, 9, New Category
このように、EntityFrameworkでは、オブジェクト指向的なプログラミングができるように設計されています。


 

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

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