Visual Studio 11 Beta 公開! EF 5が試せます。 CLR/Hのデータアクセステクノロジデイフォローアップ

以前、ブログでアナウンスしましたが北海道CLR/Hデータアクセステクノロジデイが開催されました。そこで Entity Framework 最新情報(EF 4.3、EF5)についてセッションを担当させて頂いたので、その内容をサクッとご紹介しておきます。

ちなみに、セミナー資料はこちらです。

 

 

 

■EF4.3の強化ポイント

・Database Generationの改善

・Code First & DbContext bug fixes

    - GetDatabaseValues のバグ修正

    - DbSet の名前に Unicode が使えなかったバグ修正

・Code First Migrations

 

EF4.3 ではCode First Migrationsに対応したの大きいですね。これでDBのスキーマを更新した時のデータ移行にも対応出来るようになりました。実装方法は2種類(Automatic Migration、Code-Based Migration)あります。

 

○Automatic Migration

- 自動マイグレーション

- 自動化の対象

•プロパティやクラスの追加

•プロパティやクラス名称の変更

•プロパティやクラスの名称変更をせずに、カラムやテーブル名称の変更

•プロパティの削除

 

○Code-Based Migration

- データの投入、インデックス、ユニーク、デフォルト値の指定など細かい制御が可能

 

 

■EF 5.0の強化ポイント

・Enumに対応

・Spatial types (Geography and Geometry)に対応

・Table-Valued Functionsに対応

・LocalDBに対応

     - Code First で SQLEXPRESS がなければ LocalDB が Default

・デザイナの強化

     - 下図参照

image

 

 

■試してみましょう

1.Visual Studio 11 Beta をインストールしてください。

2.コンソールアプリケーション(名前:MigrationsAutomaticDemo)を作成。

3.Package Manager Consoleを(VSの[表示]にあります)開いて下記のコマンドを実行

    Install-Package EntityFramework -IncludePrerelease

4.モデルクラス(Model.cs)を作成。

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

using System.ComponentModel.DataAnnotations;

using System.Data.Entity.Infrastructure;

using System.Data.Spatial;
namespace MigrationsAutomaticDemo
{
      public class BlogContext : DbContext
      {
          public DbSet<Blog> Blogs { get; set; }
          public DbSet<Post> Posts { get; set; }
      }
   
      public class Blog
      {
          public int BlogId { get; set; }
   
          public string Name { get; set; }
   
          [StringLength(256)]
          public string Author { get; set; }
    
           public List<Post> Posts { get; set; }
    
           //*** 4. Enum ***//
           public BlogCategory Category { get; set; }
       }
    
    
       public class Post
       {
           public int PostId { get; set; }
           [MaxLength(200)]
           public string Title { get; set; }
           public string Content { get; set; }
           public int BlogId { get; set; }
    
           //*** Code First ***//
           public string Tag { get; set; }
    
           //*** Code First Migration変更(データ投入後の動き確認) ***//
           public string Url { get; set; }
    
           //***  Code Based Migration ***//
           public int view { get; set; }
    
           //*** 5. Spatial ***//
           public DbGeography Location { get; set; }
       }
    
    
       //*** 4. Enum ***//
       public enum BlogCategory
      {
          Life,
          Picture,
          Technology
      }

 

5.Package Manager Consoleを(VSの[表示]にあります)開いて下記のコマンドを実行

    Enable-Migrations –EnableAutomaticMigrations
   MigrationsフォルダにConfiguration.csが自動的生成されます。
   ここでMigrationの振舞を指定することができますが、今回は変更なしでAutomatic Migrationを試してみます。
   namespace MigrationsAutomaticDemo.Migrations
  {
      using System;
      using System.Data.Entity;
      using System.Data.Entity.Migrations;
      using System.Linq;
   
      internal sealed class Configuration : DbMigrationsConfiguration<MigrationsAutomaticDemo.BlogContext>
      {
          public Configuration()
          {
              AutomaticMigrationsEnabled = true;
          }
   
          protected override void Seed(MigrationsAutomaticDemo.BlogContext context)
          {
              //  This method will be called after migrating to the latest version.
   
              //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
              //  to avoid creating duplicate seed data. E.g.
              //
              //    context.People.AddOrUpdate(
              //      p => p.FullName,
              //      new Person { FullName = "Andrew Peters" },
              //      new Person { FullName = "Brice Lambson" },
              //      new Person { FullName = "Rowan Miller" }
              //    );
              //
          }
      }
  }
  
  

6.Program.csを実装

EF5 では SetInitializer に MigrateDatabaseToLatestVersion が指定できようになりました。

   using System;
  using System.Collections.Generic;
  using System.Data.Entity;
  using System.Data.Spatial;
  using System.Linq;
  using System.Text;
  using MigrationsAutomaticDemo.Migrations;
   
  namespace MigrationsAutomaticDemo
  {
      class Program
      {
          static void Main(string[] args)
          {
              using (var db = new BlogContext())
              {
                  Database.SetInitializer(
                      new MigrateDatabaseToLatestVersion<BlogContext, Configuration>());
                  db.Blogs.Add(new Blog { Name = "WebMatrix の歩き方", 
                      Author = "武田正樹", Category = BlogCategory.Technology });
                  db.Posts.Add(new Post { Title = "ご挨拶", 
                      Content = "はじめまして。マイクロソフト株式会社の武田正樹です。", 
                      BlogId = 1 });
                  db.Posts.Add(new Post { Title = 
                      "WebMatrix のサイト ワークスペース", 
                      Content = "このページでは、WebMatrix のサイト ワークスペースの", 
                      BlogId = 1 });
                  db.Posts.Add(new Post { Title = "WebMatrix から ExpressWeb", 
                      Content = "ExpressWeb への発行準備方法は、こちらの記事をご覧ください。"
                      , BlogId = 1, Location = DbGeography.FromText("POINT(-122 47)") }); 
   
                  db.SaveChanges();
   
                  foreach (var blog in db.Blogs)
                  {
                      Console.WriteLine(blog.Name);
                  }
   
   
                  // Enum
                  db.Blogs.Add(new Blog { Name = "WebMatrix の歩き方",
                      Author = "武田正樹", 
                      Category = BlogCategory.Technology });
              }
          }
      }
  }

 

7.Code-Based Migrationも試してみましょう。

      Model.cs の Postクラスに次のプロパティを追加

    public int Rating { get; set; }

 

8.Package Manager Consoleを(VSの[表示]にあります)開いて下記のコマンドを実行

    Add-Migration AddBlogRating

 

Migrations フォルダーに201203140743311_AddBlogRating.csというタイムスタンプつきのクラスが生成されます。

   namespace MigrationsAutomaticDemo.Migrations
  {
      using System.Data.Entity.Migrations;
      
      public partial class AddBlogRating : DbMigration
      {
           public override void Up()
           {
               AddColumn("Posts", "Rating", c => c.Int(nullable: false));
           }
          
           public override void Down()
           {
               DropColumn("Posts", "Rating");
           }
      }
   }

 

 

9.デフォルト値の指定はコードを次のように書き換えます。

    AddColumn("Posts", "Rating", c => c.Int(nullable: false, defaultValue:3));
  
 10.DBに反映するにはPackage Manager Consoleを(VSの[表示]にあります)開いて下記のコマンドを実行
      Update-Database -Verbose

 

 

以上です。

ついでに.NET 5.0になるとパフォーマンスもずいぶん上がる予定。かなり使えそうです。

image

 

Entity Framworkは投資対象にもなっていて、着実に機能強化が行われています。MVCとの組み合わせで、広く利用されてはじめていますので、Let's try!