規約のカスタマイズ

規約のカスタマイズ


コードファーストでは規約に基づいてエンティティとDBを紐付けるのが基本ではあるが、
その規約をカスタマイズするために利用するのが属性(アノテーション)です。

【データモデルの規約に関する主な属性】

属性 概要
Table マッピングするテーブルの名前
Key 主キー列
Required NOT NULL制約
MaxLength データ長
Timestamp タイムスタンプ
ComplexType 複合型を定義
Column 列名、列の順番、データ型を定義
Index 非クラスター化インデックスを定義
NotMapped データベースにマップしない

具体的な使用例は以下の通り
[models\article.vb]

arrow_down
[実行後に作成されるテーブル(Contents)]
37
・Descriptionプロパティに対してColumn属性を指定している。
 列名は「Note」、列順は一番目、データ型はNTEXT型となる。
・通常、Required属性を付与することでNOT NULL制約をつけられるらしいが、Required属性無しでも
 NOT NULL(必須)となってしまう。
 NOT NULL制約をつけたくない場合は、ViewCountのようにNULL許容型でプロパティを定義する。
・Titleプロパティに対してMaxLength属性を付与することで、データ長(30)を指定している。
・Summaryプロパティに対してNotMapped属性を付与することで、テーブル列にマッピングしない。

 
[インデックス]
38
・Key属性を指定したUrlが主キーとなる。
・PublishedプロパティとReleasedプロパティに対してIndex属性を付与している。
 インデックス名は「Idx1」、順番はOrderで指定。


【複合型を定義する ComplexType属性】

複合型とは複数のプロパティから構成されるデータ型のことである。
モデルとしては複合型の定義は別クラスで行うが、テーブルとしては1テーブルで管理するという
場合に利用できる。(概念モデルと論理モデルが一致しないケース)

[Models\Address.vb]
複合型を定義するクラス
・ComplexType属性を指定すること。
・主キー列を設定しないこと。

 
[Models\Customer.vb]
複合型を使用するクラス

arrow_down
[実行後に作成されるテーブル(Customers)]
39
複合型のプロパティ名と複合型のクラスで定義したプロパティ名が”_”で連結され、列が作成される。
(Column属性で列名を変えてもいい。)


【Fluent APIによる規約のカスタマイズ】

属性を利用する以外にも、Fluent APIを利用することで、規約をカスタマイズできる。
エンティティの外部(コンテキストクラス)に規約を記述する。
コンテキストクラスにおいて、OnModelCreatingメソッドをオーバーライドして記述。
以下の例は、
・GoodsエンティティをItemテーブルに紐付け
・主キーをUrlに設定
・Titleプロパティの列名を「Name」に設定
・Titleプロパティのデータ長を20文字に設定

・エンティティクラス
[Models\Goods.vb]

 
・コンテキストクラス
[Models\MvcModelContext.vb]

メソッドチェーン的な書き方で規約を定義できる。
具体的にはEntityメソッド・ToTableメソッド・HasKeyメソッドはEntityTypeConfiguration型を返すので
連続で定義することができる。
Propertyメソッド・HasColumnNameメソッド・HasMaxLengthメソッドは、***PropertyConfiguration型を
返すので、プロパティ指定後は連続で定義することができる。
※HasKeyとPropertyでは引数にデリゲート型が要求されているので、ラムダ式を設定している。
 (aはここではGoods型)
arrow_down
[実行後に作成されるテーブル]
40
※Fluent APIの他のメソッドについては割愛