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
・デザイナの強化
- 下図参照
■試してみましょう
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になるとパフォーマンスもずいぶん上がる予定。かなり使えそうです。
Entity Framworkは投資対象にもなっていて、着実に機能強化が行われています。MVCとの組み合わせで、広く利用されてはじめていますので、Let's try!