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

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


#手順
1. Migrations/Configuration.csファイルを生成
2. 最初（Initial）のマイグレーションファイルを作成
3. Update-Databaseコマンドで更新（-Verboseを追加すると細かい詳細が見れます）
4. ２回目以降の変更は、それに応じたファイル名でマイグレーションファイルを作成し、再度Update-Databaseコマンドを実行


#自動マイグレーション開始方法#
まず自動マイグレーションの機能を活用したい方は、Visual Studio ＞ Package Manager Consoleにて、下記のコマンドを実行してください。そうしますとプロジェクト内に Migrations/Cofiguration.csというファイルが作成されます。（自分でフォルダとファイルを作っても大丈夫です。ただ構文間違えなどのリスクもありますので、積極的にコマンドを使っていきましょう）

>PM> **Enable-Migrations -EnableAutomaticMigrations**



#マイグレーションの追加方法#
下記のコマンドは初回の場合はModel内のコードを確認し、イニシャライザーを生成します。しかし２回目以降の実行では、もしモデルを変更している場合、その差分で新たなマイグレーションファイルを生成します。何も変更していない場合は単にスルーされます。

>*初回は自由に、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"**

>*２回目以降は、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"**


`想定エラー１`
*この移行ファイルのデザイン コードには、現在の 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"**
`想定エラー２`
*データが失われるため、自動移行は適用されませんでした。データが失われる可能性がある場合でも、DbMigrationsConfiguration で AutomaticMigrationDataLossAllowed を 'true' に設定して、自動移行の適用を許可してください。または、'-Force' オプションを指定して Update-Database を使用するか、明示的な移行をスキャフォールディングしてください。*

`解決策`

```lang: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"**