実践 Entity Framework ~ テーブルとフィールド名を変更する
Entity Framework で Code First Migrations。
前回、プロパティに属性を付けることにより、文字列の長さと NULL 非許容を設定することが可能になりました。属性を用いると、テーブル名やフィールド名も自由に設定可能になります。
既定のルール
あるエンティティクラスに対して、既定では
- テーブル名はクラス名(ただし単数形名称は複数形)
- フィールド名はプロパティ名
となっています。
通常はこれでも問題ないのかもしれませんが、実際の名称とコード側で利用する名称を異なるものにしたい場合もあるでしょう。
モデルファースト的な話になってしまいますが、既にテーブル名やフィールド名が決められており、
「そんなふざけた名称は利用したくない・・・」
なんてことは、まぁそれなりにあるでしょう。
そんなことに縛られることはありません。コード側は利用しやすい名称にしてしまいましょう。
TableAttribute
クラス名に System.ComponentModel.DataAnnotations.Schema.TableAttribute クラスをクラスに対して属性として利用すると、実テーブル名称の設定が可能になります。
ここで注意したいのは、名前空間が前出の KeyAttribute や RequiredAttribute と異なっているので、更に using 指定が必要になります。(もちろんフルネームで指定しても構いませんが・・・)
例えば次のように指定した場合
[Table("テーブル名を変更")] public class Prefecture {}
Add-Migration, Update-Database コマンドを使うと・・・
こうなります。
ちゃんと日本語も利用できます。
ColumnAttribute
一方、フィールドの指定は、System.ComponentModel.DataAnnotations.Schema.ColumnAttributeで可能です。プロパティに対して、属性として利用します。
こんな感じですね。
public class Prefecture { [Column("列名変更")] public string Field { get; set; } }
結果は省略で・・・
データ型の指定も可能
TypeName パラメータを利用すると、データ型の指定も可能です。
string の場合、既定では Unicode の NVARCHAR ですが、
public class Prefecture { ...省略 [Column("NewField", TypeName = "varchar")] public string Field { get; set; } }
とすると、
VARCHAR になります。ちなみに VARCHAR の場合、MaxLength はバイト数になります。
ColumnAttribute には、もうひとつパラメータ Order があります。
「列の並び順が指定できるのか?」
と思いがちですが、これは、キーを複数指定したときの順序です。
キーを複数指定したときは必須となり、逆にキーがひとつの場合は、意味がありません。