インクリメンタルなカイハツにっき

.NET 開発手法を中心に、これから始める方の一助となる記事を載せていく予定です。

実践 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 コマンドを使うと・・・

こうなります。

テーブル名を変更

ちゃんと日本語も利用できます。

スキーマ名の指定も可能

デフォルトのスキーマ(通常は dbo)以外を利用する場合も、この TableAttribute で指定します。
パラメータ名 Schema で、指定可能です。

[Table("Prefectures", Schema = "Test"]
public class Prefecture {}

とすると

スキーマを指定

ちゃんと変わりました。

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; }
}

とすると、

20150618181723

VARCHAR になります。ちなみに VARCHAR の場合、MaxLength はバイト数になります。

ColumnAttribute には、もうひとつパラメータ Order があります。
「列の並び順が指定できるのか?」
と思いがちですが、これは、キーを複数指定したときの順序です。
キーを複数指定したときは必須となり、逆にキーがひとつの場合は、意味がありません。

中身がほしいところ

テーブルができたところで、データも入れてみたいですね。
次回では、マイグレーション適用時にデータを代入する方法を解説します。

続きはこちら...