2015年09月06日

EntityFramework(1):Database FirstでEntityFramework事始め

   このエントリーをはてなブックマークに追加 Clip to Evernote

前回の投稿から1か月以上たってしまいました。これまではLINQ to Objectのサンプルコードを掲載してきましたが、今度は、Entity Frameworkついて書いていこうと思います。
と言っても、Entity Frameworkの範囲が広すぎて、僕の手にはおえないので、その一部の機能に限定されると思いますが...

いつものように、一つ一つの記事は短めに。

僕の環境は、
1 Visual Studio Professional 2015
2 EntityFramework 6.1.3
です。

ところで、Visual Studio Community 2015 がダウンロードできるようになりましたね。
学生、オープン ソース貢献者、小規模チームは無料で利用できます。 


さて、話を戻すと、サンプルデータベースとしては、相も変わらず Northwind を使います。
つまり、Code Firstではなく、Database First でサンプルコードを作成していきます。
といっても、最初のPOCOクラスを自動生成してしまえば、それ以降は、Code First とそれほど変わるところはありません。


SQL Server 2014で、Northwindデータベースをお使いになる場合は、 石坂忠広さんの記事を参考にしてください。
SQL Server 2014にNorthwindデータベースをインストールする

■プロジェクトの作成とサンプルDBの追加

C#のプロジェクトの新規作成します。 EntityFrameworkの機能にフォーカスするために、 ここではコンソールアプリケーションを選択します。
便宜上、プロジェクト名は、EFSample という名前で話を進めます。

プロジェクトができたら、次に、App_Data フォルダをプロジェクトに新規追加します。
作成されたVisual StudioのプロジェクトのApp_Dataフォルダに、エクスプローラから Northwnd.mdf と Northwnd_log.ldf をドロップします。
ファイルが App_Dataフォルダにコピーされると同時に、プロジェクトに追加されます。

c01

■Entity Data Model 作成

  1. プロジェクトEFSample に Models フォルダを作成します。

  2. Model フォルダを右クリックし、[新しい項目の追加]を選びます。

  3. 新しい項目の追加ダイアログが表示されますので、[ADO.NET Entity Data Model ]を選択し、名前に "NorthwindContext"と入力し、[追加]ボタンを押します。

    c02

  4. [データベースからCode First] を選択し、次へ ボタンをクリックします。

    c03

    ※ 変な名前ですね。もっと良い訳はなかったんでしょうか?

  5. 新しい接続ボタンをおして、設定のプロパティダイアログで、データソースの 変更で、Microsoft SQL Server データベースファイル を選びます。

    C051

    c04


  6. データベースのファイル名では、先ほどのNorthwnd.mdf を指定し、OK ボタンを押します。

  7. ダイアログの下の入力欄に、"NorthwindConnection" と入力し、次へを押します。

    C52

  8. 「ファイルをプロジェクトにコピーし、接続を変更しますか?」 と聞いてきますが、いいえを選択します。
    ※ はっきり言ってこのメッセージは不要ですね。はいを押すとプロジェクトの直下に mdfファイルがコピーされてしまいます。

  9. 次のウィザード画面では、すべてのテーブルをモデルに含めるので、 テーブルにチェックを入れます。 さらに、「生成されたオブジェクトの名前を複数化または単数化する」にチェックし、 完了ボタンを押します。

    c08

  10. Models フォルダに、NorthwindContext.cs と、各テーブルに対応した C#のソースフィルが追加されていることを確認します。

    c09


実際に、これらのソースファイルに中身を確認してください。 いくつかの属性が追加されてはいますが、普通のC#のクラスである ことを確認できると思います。

NorthwindContext.cs には、Categories や Customersといった テーブル名を複数形にしたプロパティが定義されています。 EntityFramework では、これらのプロパティを使い、テーブルにアクセス することになります。


次のバージョンのEntityFrameworkでは、EDMXファイル([データベースからEF Degigner]で作成される)がサポートされないことがアナウンスされています。
そのため、このシリーズでは、EDMXを使わずに、[データベースからCode First]で、エンティティモデル を作成しています。Database Firstでも問題なくプログラムを書くことができます。

■Productsテーブルの参照

Productsテーブルからデータを取得してみましょう。
プログラムでは、先ほど作成した Product「EntityFrameworkエンティティクラス」を 経由して、Productsテーブルの各カラムにアクセスすることになります。 さっそく、このProductsテーブルにアクセスするコードを書いてみます。

 using LinqToEntitySample.Models;
 ...

 static void Main(string[] args) {
     using (var db = new NorthwindContext()) {
         var query = from product in db.Products
                     select product;
         foreach (Product p in query)
             Console.WriteLine("{0} | {1} | {2} | {3}",
                 p.ProductID, p.ProductName, p.UnitPrice, p.QuantityPerUnit);
         Console.ReadLine();
     }
 }

実行すると、


  1 | Chai | 18.0000 | 10 boxes x 20 bags
  2 | Chang | 19.0000 | 24 - 12 oz bottles
  3 | Aniseed Syrup | 10.0000 | 12 - 550 ml bottles
  4 | Chef Anton's Cajun Seasoning | 22.0000 | 48 - 6 oz jars
  5 | Chef Anton's Gumbo Mix | 21.3500 | 36 boxes
  6 | Grandma's Boysenberry Spread | 25.0000 | 12 - 8 oz jars
  7 | Uncle Bob's Organic Dried Pears | 30.0000 | 12 - 1 lb pkgs.
 .
 .
 .

と表示され、Productsテーブルからデータを取得できたことを確認できます。
NorthwindContext クラスは、[データベースからCode First]の追加で自動生成されたクラ スで、NorthwindContext.csで以下のように定義されています。

    public partial class NorthwindContext : DbContext {
        public NorthwindContext()
            : base("name=NorthwindContext") {
        }

        public virtual DbSet Categories { get; set; }
        public virtual DbSet CustomerDemographics { get; set; }
        public virtual DbSet Customers { get; set; }
        public virtual DbSet Employees { get; set; }
        public virtual DbSet Order_Details { get; set; }
        public virtual DbSet Orders { get; set; }
        public virtual DbSet Products { get; set; }
        public virtual DbSet Regions { get; set; }

       以下省略

先ほど利用した Productsプロパティも定義されていますね。 EntityFrameworkでは、このDbContextクラスの派生クラスのインスタンスを生成 することで、データベースにアクセスすることが可能になります。

先ほどのクエリ式では、Productsテーブルから全てのデータを取得しています。各カラムの値は、プロパティとしてアクセスできます。
なお、Productsテーブルを示すNorthwindContextクラスのプロパティ名はProductsと複数形になっている点に注目してください。単数形のProductは、1行分を表すクラスです。

今回は、これで終わり。
次回からは LINQ to Entitiesを使ったクエリについて書いていきます。



 

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

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