生成元コード作成
最初に、コードを生成する元となるデータモデルクラスとDbContext派生クラスを作成します。
データモデルの作成
コード生成の元となるデータモデルのクラスです。Modelsというフォルダーをプロジェクトに作成し、そこにLocationという名前のクラスを新たに作成してください(リスト1)。
using System; using System.ComponentModel.DataAnnotations; namespace MRRS_Scaffolding.Models { public class Location //(1) { [ScaffoldColumn(false)] public int Id { get; set; } //(2) [Display(Name="場所名")] //(3) [Required(ErrorMessage="場所名を入力してください。")] //(4) public string Name { get; set; } } }
データモデルとなるクラスを作成する際のポイントは、以下の4点です。
(1)クラス名がテーブル名となる
データモデルクラス名を複数形にしたものが、生成されるテーブルの名前になります。今回の例では、Locationがデータモデル名、Locationsがテーブル名になります。
(2)プライマリキーとなるフィールドをIdという名前で作成する
「Id」という名前のフィールドがあると、データベースのテーブルを生成した際、そのフィールドを自動的にプライマリキーにして生成します。なお、Id項目は通常画面に出しませんので、System.ComponentModel.DataAnnotations名前空間のScaffoldColumn属性の引数にfalseを渡すことで、自動生成される画面には出力されないようにします。
なお、Entity FrameworkのCodeFirstのルールでは、「Id」以外の名前の項目をプライマリキーにしたい場合、System.ComponentModel.DataAnnotations名前空間のKey属性を付ければ良いことになっています。しかし、プレリリース版のScaffoldingでは自動的にKey属性のついた項目を画面側でプライマリキーとして扱ってはくれず、無条件に「Id」という名前を使ってコードを生成してしまいますので、注意が必要です。どうしても「Id」以外の名前を使いたい場合は、生成後のコードの「Id」を使っている箇所を、すべて手で修正する必要があります。
この制限は「設定より規約(Convention over Configuration)」という考えに沿ったものであると考えます。この考えは昨今の風潮であり、ASP.NET MVCでも取り入れられています。今後の正式リリースでは、Key属性を解釈してくれるようになるかもしれませんが、素直に「Id」列をプライマリキーとしたほうが面倒がないでしょう。
(3)画面への表示名をDisplay属性で指定する
自動生成する項目の画面での表示名を、System.ComponentModel.DataAnnotations名前空間のDisplay属性を使って指定します。
(4)必須入力項目であることを、Required属性で指定する
必須入力としたい項目については、System.ComponentModel.DataAnnotations名前空間のRequired属性を指定します。すると、画面でも必須入力項目として扱われるようになります。なお、ErrorMessageプロパティには必須入力エラーの際に表示したいメッセージを指定します。
なお、他にも第4回で紹介したモデル検証で使える検証属性が指定可能です。表1に再掲します。
属性名 | 説明 | 主なプロパティ |
---|---|---|
Compare | 他のプロパティと等しいかどうか検証する | OtherProperty: 比較対象のプロパティ名 |
Range | 数値が範囲内であるかどうか検証する | Maximum:最大値、 Minimum:最小値、 OperandType:検証対象の値の型 |
StringLength | 文字列長が班内であるかどうか検証する | MaximumLength:最大文字列長、 MinimumLenght:最少文字列長 |
EmailAddress | 文字列がEメールアドレスとして妥当かどうか検証する | |
FileExtensions | ファイル名の拡張子が妥当であるか検証する | Extensions:拡張子 |
Phone | 文字列が電話番号として妥当かどうか検証する | |
Url | 文字列がURLとして妥当かどうか検証する |
DbContext派生クラスの作成
現時点のScaffoldingで生成されるコードでは、データアクセスにEntity Frameworkを用います。そのため、System.Data.Entity名前空間のDbContextクラスを継承した、中身が空のクラスを作成しておく必要があります。今回はデータモデルと同じModelsフォルダーに、MRRSContextクラスとして作成しておきます(リスト2)。
using System; using System.Data.Entity; namespace MRRS_Scaffolding.Models { public class MRRSContext : DbContext { } }
DbContextクラスとは、Entity Frameworkを用いたデータアクセスの基本となるクラスです。複数のテーブルをまたがった追加、変更、削除といった「トランザクション」を管理するためのクラスで、いわゆる「ユニット・オブ・ワーク(Unit of work)」パターンの実装です。
DbContextクラスの派生クラスに、操作対象のテーブルに対応したDbSet<T>型のプロパティを配置し、そのDbSet<T>型プロパティに対して追加、変更、削除などを行った後、DbContextクラスに用意されたSaveChagesメソッドを呼び出すことで、トランザクションを確定させます。詳しくは以下の記事などを参照ください。