読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

今度こそ、Entity Framework6をVisual Studio2010で使ってみる

前回の検証にて

C#のセミナーで最新のEntity Framework6のLogging機能を知り、Visual Studil2010で試してみたもののうまく行かず。。。
そもそもの原因はCode Firstという開発手法を知らないことにありました。
Code Firstについては「Entity Framework Code First」などでぐぐると沢山でてきますね!
今回は下記の記事を参考に(まるっと)試してみました。

Entity Framework での新しいデータベース向けの Code First

検証

VS2010でEFをCode Firstで開発するにはNuGetパッケージマネージャーより「Entity Framework」をインストールする必要があります。
前回と同様にプロジェクトに最新のEF6をインストールし、Logging機能のコードを追加しました。

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

namespace CodeFirstNewDatabaseSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new BloggingContext())
            {
                // Create and save a new Blog 
                Console.Write("Enter a name for a new Blog: ");
                var name = Console.ReadLine();

                var blog = new Blog { Name = name };
                db.Blogs.Add(blog);
                db.SaveChanges();

                // Display all Blogs from the database 
                var query = from b in db.Blogs
                            orderby b.Name
                            select b;

                //Logging機能を試してみる
                db.Database.Log = x => { Console.WriteLine(x); };

                Console.WriteLine("All blogs in the database:");
                foreach (var item in query)
                {
                    Console.WriteLine(item.Name);
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            } 
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }

        public virtual List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }
}

実行結果はこんな感じ。
f:id:sh_yoshida:20140211071143p:plain
Logging機能によりクエリがコンソールに出力されました!
これで非効率的なクエリが生成されていないか判断できます。

データベースにもちゃんとデータが入ってました。
f:id:sh_yoshida:20140211071307p:plain
スキーマ/DB名は規約に従い命名されました。
App.configファイルに接続情報などを書いておくとそっちから作成もしてくれます。

まとめ

Entity Frameworkには三種類の開発方法があります。

VS2010の場合は、テンプレートよりEntity Data Modelを作成するとSystem.Data.Objects名前空間のObjectContextからコンテキストクラスが自動生成されました。これによりデザイナが使えDatabase First、Model Firstによる開発が可能です。

Code Firstの場合は少し異なり、NuGetパッケージマネージャーより別途Entity Frameworkをプロジェクト単位でインストールする必要があります。これによりSystem.Data.Entity名前空間のDbContextから派生したコンテキストクラスが利用可能になります。

一方VS2013ではテンプレートからでもDbContextベースのコンテキストクラスが自動生成されるので、デザイナも使えます。

Entity Framework6を使うならVisual Studio2013で開発するのがベスト!
どうしてもVisual Studio2010で使うならCode Firstで。