Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
以前、ブログでアナウンスしましたが北海道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!