##コメント
既存のmigrationに関する記事なんて大量にあるしそれに比べると陳腐になりそうではあるけども自分なりにまとめる機会があったのでせっかくだからQiitaにも投稿してみる。
※間違ってる箇所等ありましたらコメントいただけると幸いです。
##テーブルの作成、変更の手順について
####1,visual studio上で変更する対象のテーブルを開く又は、新規作成するテーブルのファイルを開きます。
####2,対象のテーブルに必要なカラムを記述します。
例)
public int ID { get; set; }
※intやdoubleなど、通常null非許容の型に対してnull許容型を指定する場合は以下のようにします。
int?,double?
####3,各カラムに必要であればアトリビュートを追加します。
例)
[Key]
public int ID { get; set; }
※よく用いるアノテーションについて
[Key]
このアノテーションを付けたカラムはそのテーブルにおいて主キーであることを示します。
[Required]
このアノテーションを付けたカラムはそのテーブルにおいて必須項目であることを示します。
[StringLength(〇〇)]
対象のカラムの最長文字数を設定します。〇〇部分に指定の最長文字数を入力します。
[DatabaseGenerated(DatabaseGeneratedOption.〇〇)]
テーブルにレコードが作成されたときに、自動的に値を生成するかどうかを設定することができます。
〇〇部分
・None
値の生成を行いません。
・Identity
行が挿入された場合に自動で値を生成します。
・Computed
行が挿入または変更された場合に自動で値を生成します。
[Column]
テーブルに表示される列の順序の指定やカラム名のオーバーライドを行うことができます。
[Column(“string”)]
上記のアノテーションを付けた場合、元の名前から”string”にオーバーライドされてDBへ登録されます。
[Column(Order=int)]
上記のアノテーションを付けた場合、もともと記述されている順序からint番目へと順番の修正が行われます。
[Column(TypeName=”string”)]
上記のアノテーションを付けた場合、もともと記述されている型から”string”型へとオーバーライドされて登録されます。
※上記[Column]アノテーションのプロパティを一つのカラムに対して複数同時に用いたい場合は以下のように記述します。
例)[Column(“string”,Order=int,TypeName=”string”)]
[Column(Order=int,TypeName=”string”)]
※テーブルを新規作成する場合
####4,テーブルの新規作成時のみ、DbConextを継承しているファイルに新規作成するテーブルの記述を行います。
記述例)
public virtual DbSet NewTable { get; set; }
##Database migrationの手順について
1,visual studio上で、表示→パッケージマネージャーコントロールを開く。
2,パッケージマネージャーコントロールの「既定のプロジェクト」がテーブルのモデル等が存在しているプロジェクトになっていることを確認する。
(なっていない場合は対象のプロジェクトに変更する。)
3,パッケージマネージャーコントロール上において、Add-Migration 〇〇
と入力し、実行します。
(○○に入力した名前が作成されたMigrationファイルの名前になります。〇〇には変更箇所名などわかりやすい名前を記入するのがいいでしょう。)
4,実行後、Migrationファイルが生成されます。
生成されたMigrationファイルのUpメソッド内に更新後の内容が表示されます。
生成されたMigrationファイルのDownメソッド内に更新前の内容が表示されます。
5,パッケージマネージャーコントロール上においてupdate-database
と入力し、実行します。
MigrationファイルのUpメソッド内に記述してある変更がDBへ反映されます。
##SQLのみ発行し、その場ではDBへ反映させないようにする場合
ローカルの環境から本番環境に向けて手動で更新するときなど
※1~4についてはDatabase migrationの手順について
と同様
1,パッケージマネージャーコントロール上においてupdate-database -script
と入力し、実行します。
MigrationファイルのUpメソッド内に記述してある変更がscript化されて出力されます。
あとはSSMS等で直接scriptを実行すればOK