mvcConf @:Japan ふりかえり 3: MVC 3 のスキャッフォールディング
ASP.NET MVC 3では、スキャッフォールドの形式が変わり、コントローラーの追加からビューの作成までを一度に行うことができるようになりました。
オプションのテンプレートで上記のように設定すると、指定したコントローラーとIndex.cshtml、Create.cshtml、Details.cshtml、Edit.cshtml、Delete.cshtmlの5つのビューを作成してくれます。
データコンテキストクラスにはCodeFirstで作成するDbContextを継承したクラス以外に、Entity Frameworkのデータベースファースト、モデルファーストで仕様するObjectContextを継承したクラスが利用できます。
DbContextを利用している場合とObjectContextを利用している場合ではコントロールクラス内に生成されるプログラムが異なっており、それぞれにあわせて適切なメソッドを利用するようになっています。
このことからもわかるように、MVC 3 のスキャッフォールディングはデータの操作のサンプルとして有用です。
どのようなメソッドでデータ操作を行っているか確認してみましょう。
なお、テストを構築するためにリポジトリパターンでコントローラーを作成するサンプルがほしい、という場合はNuGetからインストールできるMvcScaffoldingを試してみてください。
リポジトリパターンを利用したコントローラーだけでなく、そのテストメソッドまでを生成することができます。
リポジトリパターンを利用しない場合でも、MvcScaffoldingで生成されるコントローラー、ビューは標準のスキャッフォールディングで作成されるプログラムと少し異なりますので、どこが違うかを見てみるのも勉強になると思います。
DbContextでは単一のデータを取得するのにFindメソッドが使えます。
従来だとSingleメソッド等を使っていた部分なので、引数に m => m.ID == id といったラムダ式を記述する必要がありました。
少しですがタイプ数が改善されています。
複数のデータを取得する場合、特にナビゲーションプロパティに含まれる値を取得するにはIncludeメソッドを利用します。
ちなみに、ナビゲーションプロパティにvirtualの設定をしてレイジーローディングを有効にしている場合はIncludeを利用しなくてもプログラム自体は動作します。
ただしこの場合、必要になった時点でデータの取得が行われるため、複数回の問い合わせがデータベースに対して行われることになります。
Includeを利用することでデータベースへの問い合わせ(コストが高い)の回数を減らすことができます。
データ更新時のEntryメソッドもDbContextで新しく追加されたメソッドです。
従来ですとAttachした後に更新状態を変更する、という2度の手間が必要だった作業を1行に簡潔に記述できるようになっています。
なお、CodeFirstではDbSetを用いることでデータの状態変更を追跡することができるようになっています。
これはWPFアプリケーション等クライアント側でデータの状態(ステート)を保持して操作する場合には大変有効な機能です。
ただ、Webアプリケーションは基本がステートレスとなり、リクエストを超えてデータの状態を保持することは逆に面倒になります。
上記のようにリクエストにより与えられたデータをAttachし、データ更新を行う、というのが一般的な手順となります。
MVC 3のスキャッフォールディングで個人的に一番感銘を受けたのがDropDownListを利用するためのプログラムの生成の部分です。
サンプルプログラムで作成したような1対多の状態を作成していると、自動的にDropDownListによるマスター項目の選択ができるようになっています。
これを実現するのに、上記の2行のコードしか必要ではありません。
ものすごくシンプルです。
この書き方は参考になりますが、なかの仕組みはわかりにくいかと思います。
なぜこれで動くのか、というのを掘り下げてみると、いろいろと応用がきくのではないかと思います。
-
2011年6月22日 5:47 午後mvcConf @:Japan のセッションビデオが公開されました « ブチザッキ