はじめに#
備忘録の為、頻繁に更新しますことをご了承下さい。またコメント等をしていただいたら、最適なものを選択、もしくは参考に逐一更新していきます。
手順
- Migrations/Configuration.csファイルを生成
- 最初(Initial)のマイグレーションファイルを作成
- Update-Databaseコマンドで更新(-Verboseを追加すると細かい詳細が見れます)
- 2回目以降の変更は、それに応じたファイル名でマイグレーションファイルを作成し、再度Update-Databaseコマンドを実行
自動マイグレーション開始方法#
まず自動マイグレーションの機能を活用したい方は、Visual Studio > Package Manager Consoleにて、下記のコマンドを実行してください。そうしますとプロジェクト内に Migrations/Cofiguration.csというファイルが作成されます。(自分でフォルダとファイルを作っても大丈夫です。ただ構文間違えなどのリスクもありますので、積極的にコマンドを使っていきましょう)
PM> Enable-Migrations -EnableAutomaticMigrations
マイグレーションの追加方法#
下記のコマンドは初回の場合はModel内のコードを確認し、イニシャライザーを生成します。しかし2回目以降の実行では、もしモデルを変更している場合、その差分で新たなマイグレーションファイルを生成します。何も変更していない場合は単にスルーされます。
初回は自由に、Model/User.csなどを編集し Initial とかの名前で生成
ローカル
PM> Add-Migration Initial
サーバー(Azureなど)
PM> Add-Migration Initial -StartUpProjectName プロジェクト名 -ConnectionString "Server=tcp:サーバー名.database.windows.net,1433;Database=データベース名;User ID=データベースのユーザー名@サーバー名;Password=パスワード;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;" -ConnectionProviderName "System.Data.SqlClient"
2回目以降は、Model/User.csなどを編集し、その内容名で生成(下記は最初メールカラムがあったがいらなくて消した時のカラム名です。まぁ正直わかればなんでもいいです。)このとき元々のモデルの差分でMigrationファイルが生成されますので、中身を確認し、下記のアップデー>トコマンドを叩くだけ。
ローカル
PM> Add-Migration RemoveEmailColumn
サーバー(Azureなど)
PM> Add-Migration RemoveEmailColumn -StartUpProjectName プロジェクト名 -ConnectionString "Server=tcp:サーバー名.database.windows.net,1433;Database=データベース名;User ID=データベースのユーザー名@サーバー名;Password=パスワード;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;" -ConnectionProviderName "System.Data.SqlClient"
想定エラー1
この移行ファイルのデザイン コードには、現在の Code First モデルのスナップショットが含まれています。このスナップショットは次の移行をスキャフォールディングする際、モデルに対する変更の計算に使用されます。モデルに追加の変更を行い、この移行に含める場合は、'Add-Migration Initial' を再実行して再度スキャフォールディングできます。'Initial' を呼び出した前の移行が、ターゲット データベースに既に適用されています。'Initial' を再度スキャフォールディングするには、'Update-Database -TargetMigration $InitialDatabase' を実行して元に戻してから '2015XXXXXXXXXXX_Initial.cs' を削除し、'Add-Migration Initial' を再度実行してください。
解決策
ローカル
Migrations/2015XXXXXXXXXXX_Initial.csファイルを削除し、下記を実行してください
PM> Update-Database -TargetMigration $InitialDatabase
サーバー(Azureなど)
PM> Update-Database -TargetMigration $InitialDatabase -StartUpProjectName プロジェクト名 -ConnectionString "Server=tcp:サーバー名.database.windows.net,1433;Database=データベース名;User ID=データベースのユーザー名@サーバー名;Password=パスワード;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;" -ConnectionProviderName "System.Data.SqlClient"
想定エラー2
データが失われるため、自動移行は適用されませんでした。データが失われる可能性がある場合でも、DbMigrationsConfiguration で AutomaticMigrationDataLossAllowed を 'true' に設定して、自動移行の適用を許可してください。または、'-Force' オプションを指定して Update-Database を使用するか、明示的な移行をスキャフォールディングしてください。
解決策
public Configuration(){
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true; <= これを追加してください
}
マイグレーションの適用方法#
下記コマンドは実行していないMigrationファイルがあるときに実行されます。Seed(データベースの初期データ)の変更だけしたい時もこのコマンドを使います。このときもし全て適用されている場合はスルーされます。
ローカル
PM> Update-Database
サーバー(Azureなど)
PM> Update-Database -StartUpProjectName プロジェクト名 -ConnectionString "Server=tcp:サーバー名.database.windows.net,1433;Database=データベース名;User ID=データベースのユーザー名@サーバー名;Password=パスワード;Trusted_Connection=False;Encrypt=True;MultipleActiveResultSets=True;Max Pool Size=100;" -ConnectionProviderName "System.Data.SqlClient"