2011年9月23日金曜日

DB Migration on EF4 alpha 3

Code First Migrations: Alpha 3 Released - ADO.NET team blog - Site Home - MSDN Blogs

EF.Migrationのアルファ3でた。前回はSQL CompactとSQL Expressへの依存が入ってたみたいで、ちゃんと動かせなかったけど、今回これは削除されたって。これでやっと試せる。

せっかくなので

↑この2つを試してみよう。

そのまえに!すでにEF4.1のパッケージをインストールしている場合は、削除するか最新版に更新しましょう。今回は削除したけど。これが残ってるとマイグレーションできないので気をつけてね。

まずはNoMagic(AutomaticMigrationsEnabled = false;)。書かれてる通りの操作をするとあれよあれよと、DBが更新されていく。

  1. データベースが作られてBlogsテーブルが出来る。
  2. Blogsにカラムとユニークインデックスの追加、Postsテーブルが追加。
  3. Postsにカラム追加しつつ、カスタムのUpdate文を実行。

※黄色い箇所は手書きしましょう。

既存のデータベースにたいしての、途中からのマイグレーションはできないってさ。

どうやってトラッキングしてるのかというとCodeFirstではEdmMetadataユーザーテーブルだったのが、__MigrationHistoryシステムテーブルに引っ越して管理されてます。

Add-Migrationで変更分のコードを自動生成。差分は手で入力。DbMigrationの派生クラスが作成されるので、いかようにもいじれますね。ただ、どんなメソッドがあるんだろね。ドキュメント希望。どっかにあるけ?

Update-DatabaseでデータベースにSQL発行。-Verbose付けとくと発行されるSQLが実行時に確認できます。ただ、手元の環境では-Scriptがエラーで動きませんでした。SQLをファイルにしてくれるオプションのはずなんだけどなー...。

続いてMagic(AutomaticMigrationsEnabled = true;)。何がマジックかというと、Add-MigrationしないでいきなりUpdate-Database。すると、ちゃんとMigrationHistoryにAutomaticMigrationとしてレコードが作られて、テーブルも作成されている。凄いね。

カスタムSQLの実行や、カラム初期値を指定する場合なんかだと、コードに指定したメタから生成される情報からだと足りないから、手書きで足してたんだけど、Automaticだとどうするかというと、これがまた単純にAdd-Migrationを呼んで、空のマイグレーションファイルを作成(Up/Downが空)しておいて、そこに書きこんでいくだけ。適用はUpdate-Databaseで、ドーン!

面白いね。しかもコレ、途中経過のDbMigrationがいないのに、ちゃんとDownしていく。なんで??-Verboseつけて実行すると、ちゃんと差分カラムの削除だけ実行してる...。まさにマジック!気持ち悪ーい。

でも、多分AutoMigrationはオススメしないかなー。何をやったのかの履歴が目で見てわからないもん。バージョン管理デキナイヨ!コードでするからやらないよ!?なのかな。

途中までTumblrで書いてたけど中途半端に長くなったので、こっちに移動しました。なのでスクリーンショットもなくてすいません。ただ!やればわかる!書いてることなぞるだけだし。MVC4のMobileチュートリアルよりよっぽどミスしないよ。

Ef41A3

せっかくなのでお試しあれー。

あ、そうそう、結局EFのCodeFirstなのでデータベースを接続文字列ベースにしたいときは、App.ConfigにconnectionStringsを追加してその名前をDbContextの派生クラス(今回ならBlogContext)のctor : base(“名前”)とすればいいです。