モデルへの接続
こうしてエンティティデータモデルを作成し、プロジェクトに追加したら、アプリケーションの他の部分にデータモデルを接続できます。ASP.NET Dynamic Dataアプリケーションにはメタモデルというものがあり、LINQまたはADO.NET Entity Frameworkのコンテキストで接続できます。
メタモデルには、ASP.NET Dynamic Dataアプリケーションを使って編集するデータベースの情報のほか、表示するテーブルの情報や、列の整形方法に関する情報などが含まれています。
メタモデルの初期化はGlobal.asaxのコードビハインドファイルで行われます。アプリケーション全体の設定を記述するにはうってつけの場所です。Global.asaxファイルのコード(およびそのコードビハインドファイルのGlobal.asax.cs)が実行されるのは、ASP.NETアプリケーションの読み込み時(つまり最初のページの送信の直前)です。
デフォルトの実装を見てみると、メタモデルの登録方法に関する長いコメントがあります。コメントの最後の行(29行目あたり)が実際のコード行です。この行のコメントを解除し、編集を加えて、データソースをアプリケーションに接続または登録します。エンティティモデルの名前をNorthwindEntitiesとした場合、コードは次のようになります。
model.RegisterContext(typeof(NorthwindEntities),
new ContextConfiguration() {
ScaffoldAllTables = true
});
データモデルのインスタンスを指定する必要はありません。C#のtypeof演算子でクラスの型を指定するだけで事足ります。内部的には、リフレクションを使って必要なデータが実行時に収集されます。
次に、スキャフォールディング(scaffolding)という概念について理解しましょう。ASP.NET Dynamic Dataでは、最終的に生成するアプリケーションでどのデータベーステーブルのどのフィールドを編集可能オブジェクトに対応付けるかを、スキャフォールディングという仕組みで指定します。デフォルトでは、アプリケーションにはどのテーブルも表示されませんが、テストのために、全テーブルの全フィールドを編集可能にすることも可能です。それには、前述のコードのように、ScaffoldAllTablesプロパティをtrueに設定します。
これらの登録を行うと、アプリケーションを実行できるようになります。アプリケーションのデフォルトページには、データモデルに含まれるすべてのテーブルが表示され(図5を参照)、各テーブル名がリンクとなっています。リンクをクリックすると、そのテーブルのレコードを表示するページに移動します(図6を参照)。レコードの一覧ページには、新規レコードを作成するためのリンクや、各レコードの編集と削除を行うためのリンクがあります。デフォルトでは、これらの編集は別ページで行いますが、ASP.NET Dynamic Dataはデータグリッドによるインプレース編集にも対応しています。
ASP.NET Dynamic Dataはインテリジェントな機能も備えています。モデル(およびその基になるデータベース)でテーブル間に参照整合性が設定されている場合、当該テーブルから関係するテーブルへのリンクが表示されます。今回のサンプルデータベースの場合、1人の顧客が複数の注文を行っているケースもあります。このため、Customersテーブルの一覧には、この顧客による注文へのリンクが自動で表示されます。注文ページも同様で、注文の詳細行へのリンクが自動で表示されます。
Dynamic Dataアプリケーションの構造
生成されたWebアプリケーションと、標準装備の豊富な機能をしばらく試したら、ブラウザを閉じてVisual Studioに戻りましょう。次は、ASP.NET Dynamic Dataアプリケーションの構造について見ていくことにします。
まずは、プロジェクトに含まれているDynamicDataという特別なフォルダです。これがこのフォルダのデフォルトの名前ですが、Global.asax.csファイルでメタモデルのクラスのDynamicDataFolderVirtualPathプロパティを設定すれば、別の名前にも変更できます。
DynamicDataフォルダのサブフォルダには要注目です。重要なのは、Content、CustomPages、FieldTemplates、PageTemplatesという4つのサブフォルダです。Contentフォルダには、アプリケーションで使用するロゴなどの画像や共通リソースが入っています(実際のレイアウトにはSite.masterというマスターテンプレートが使用されます)。CustomPagesフォルダは最初は空ですが、個別のテーブル用にページを作成する場合のプレースホルダとなります。デフォルトのASP.NET Dynamic Dataアプリケーションでは、すべてのテーブルの一覧ページと編集ページが同じ外観と操作性を持ちます。ここで例えば、顧客レコードと注文レコードの挿入には別のページを用意したいとなった場合、そのレイアウトページをCustomPagesフォルダに保存することになります。
残る2つのサブフォルダは、ASP.NET Dynamic Dataアプリケーションの動作で重要な役割を果たします。1つはFieldTemplatesフォルダです。このフォルダには十数個ほどのユーザーコントロールが入っており、それぞれ特定の型のデータベースフィールドの表示に使用されます。例えば、Boolean型のフィールドにはBoolean.ascxのコントロールが使用され、VARCHAR型のフィールドにはText.ascxのコントロールが使用される、といった形です。ASP.NET Dynamic Dataはモデルに基づいて各列の型を判別し、表示するコントロールを決定します。
PageTemplatesフォルダには、標準で使用するページに対応する一連の.aspxファイルが入っています。基本的なデータベース操作に対応するファイルとしては、データを作成するInsert.aspx、データを表示するList.aspx、データを更新するEdit.aspxの3種類があります。4つ目の基本操作である削除に関しては、List.aspxが処理します。
以上の知識をふまえてこれらのファイルを開いてみると、それぞれの構造をつかめます。前述のとおり、モデルで使用するすべてのテーブルは、同じ.aspxページ(および対応するコードビハインドファイル)を使って表示されます。従って、これらのページは、モデルに基づいて静的に生成されたものではなく、モデルに基づいて実行時に処理されます。このため、.aspxファイルのコードには、ページクラスで定義された変数であるtableというオブジェクトがたびたび出てきます。
このオブジェクトは実際にはMetaTable型で、選択したテーブルに関するメタ情報を格納しています。オブジェクト自身の初期化はPage_Loadイベントハンドラで行います。.aspxファイルでは、table.DisplayNameやtable.GetActionPathといった形でメンバを参照しています。


