LoginSignup
7
14

More than 5 years have passed since last update.

ASP.NET MVCで、Package Manager Console(パッケージマネージャコンソール)を利用し、Code Firstでマイグレーションを使う時の方法

Last updated at Posted at 2015-11-10

はじめに

備忘録の為、頻繁に更新しますことをご了承下さい。またコメント等をしていただいたら、最適なものを選択、もしくは参考に逐一更新していきます。

手順

  1. Migrations/Configuration.csファイルを生成
  2. 最初(Initial)のマイグレーションファイルを作成
  3. Update-Databaseコマンドで更新(-Verboseを追加すると細かい詳細が見れます)
  4. 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 を使用するか、明示的な移行をスキャフォールディングしてください。

解決策

Migrations/Configuration.cs
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"

7
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
14