ピースペース

Code First Migrationでぐだぐだになる

leave a comment »

EFでは自動マイグレーションができるようになっていて
開発時には、もはやDBの存在を忘れてModelに集中できる!…という時代になりつつある。
に毎度ハマって、悶々するので少し頑張って整理してみた。

Code First Migrationについての最初の一歩はここから
http://msdn.microsoft.com/ja-jp/data/jj591621.aspx

に書いてある手順通りに行えば、Migrationは成功する♪
が、実際の現場では失敗することも起こる。
例えば、追加したModelをMigrateした後に削除してMigrateしようとするとエラーになる
で、このとき、わかってないでいろいろやると、さらに泥沼化する;;

  • Migrationフォルダを削除してしまう
  • DBスキーマをサーバーエクスプローラで直接編集してしまう
  • にっちもさっちもいかなくなって、DBを削除して・・・再生成ができなくなる

などをして、はて次はいったいどうすれば?となり、何もわかっていない→Migration。に気づく

最初の一歩にははっきり書かれてはいないが、
自動マイグレーションを運用するには、手動マイグレーションができる必要がある。
手動マイグレーションコマンドが何を入力して何を生成、更新するか?を理解しておく必要がある。
コマンドと、コマンドが生成するクラスコードと、_MigrationHistoryの関係。
を、いろいろ試行して整理しておいた方が良い。あたりまえだけど;
その後からだね→自動マイグレーション

Migrateに必要なコマンドは3つ、Enable-Migrations, Add-Migration, Update-database

■Enable-Migrations
Migrationの準備
プロジェクトにMigrationsフォルダを作成して、Configlationクラスを生成する
Disableするコマンドはない。Migrationsフォルダの削除がそれに相当する??
Migrationsフォルダを削除しても、必要になれば再度Enable-Migrationsすれば良い
が、このときなぜか、その後のAdd-Migrationの出力が、_MigrationHistoryとマッチしなくなることがある
ような気がする。が、再現しないので他の要因がからんだ勘違いかもしれない
が、コマンドが使用するDB接続が混乱することがあるような気がする

■Add-Migration
DBの_MigrationHistoryと現在のDbContextの定義を比べて、 (←ここが一番肝心か)
その差分をDBに反映させるためのMigrationクラスを生成する

■Update-database
ConfiglationクラスとMigrationクラスを使って、DBを更新するSQLを実行する

■_MigrationHistoryテーブル
MigrateによりDBに反映されたModel内容を記録している
DBスキーマと最後のMigrateモデルは同期している
ので、DBスキーマを直接編集してはならない

もし、同期を壊してしまったら
update-database -TargetMigration:(_MigrationHistoryレコードのMigrationId)
で同期がとれている任意の時点に戻せる
このとき、update-databaseが入力に使うのは_MigrationHistoryなので、
その時点のMigrateに使用したMigrationクラスコードはいらない
Migrationクラスコードファイルは、Migrateの都度、生成して使うものなので保存しておく必要はない

あと、Drop Table, Drop Columnの実行を含むMigrate時には、Configlationに
AutomaticMigrationDataLossAllowed = true;
が必要

たったこれだけ整理するのに、一日かかってしまったよ;;
最初の一歩は、手順ではなく仕組みの説明であればいいのに!と思うのであった

Written by nasu38yen

2014年1月22日 @ 12:48 PM

カテゴリー: .NET

Tagged with

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。