ASP.NET MVCの持つ自動生成機能を使って、データベース連携アプリを作成する。ASP.NET MVCの素晴らしさを実感できる機能だ。
本連載では、MVCモデルをベースとした.NET Frameworkの新たなアプリケーション・フレームワーク「ASP.NET MVC」を基礎から解説している。前回は、Model−View−Controllerのうち、主に「View」「Controller」について解説した。今回は残る1つである「Model」を中心に、データベース連携アプリケーションを作成してみよう。
また今回は、ASP.NET MVCでデータベース連携の機能を実装する場合には欠かせない「スキャフォールディング(Scaffolding)機能」についても解説する。「Scaffolding」とは「足場」という意味で、データベースの基本操作(登録、参照、更新など)に必要な機能の骨組みを自動生成する機能のことをいう。
スキャフォールディング機能を利用することで、定型的なコードを一から記述することなく、どれだけ簡単にアプリケーションを開発できるのかを、本稿で実感いただきたい。
まずは、今回ASP.NET MVCで作成するサンプルWebアプリケーションの全画面を以下に示す。
なお、以降のサンプルを動作させるには、あらかじめデータベース上に以下の表1のようなBookテーブル(書籍情報)を用意しておく必要がある。Bookテーブルには、アプリケーションから参照/更新できるように適当なデータを何件か登録しておこう。
| フィールド名 | データ型 | 概要 | 
|---|---|---|
| isbn | CHAR(17) | ISBNコード(主キー) | 
| title | VARCHAR(100) | 書名 | 
| price | SMALLINT | 価格 | 
| publish | VARCHAR(25) | 出版社名 | 
| published | DATE | 刊行日 | 
| 表1 Bookテーブルのフィールド・レイアウト | ||
表1のBookテーブルを定義し、何件かのサンプル・データを入力したデータベース・ファイル(MyMvc.mdf)は以下のリンクからダウンロードできる。
それではさっそく、具体的な手順を追っていく。
Model−View−Controllerモデルにおいて、Modelとはアプリケーションで扱うデータを表すとともに、データを操作するための手続き(ビジネス・ロジック)を担う要素だ。
ASP.NET MVCでは、データ・モデルとして.NET Framework標準のADO.NET Entity FrameworkやLINQ to SQLはもちろん、NHibernateのような外部ライブラリを採用することもできるが、本稿ではADO.NET Entity Frameworkが提供する「Entity Dataモデル」を利用するものとする。
Entity Dataモデルを作成するには、「ASP.NET MVC Web Application」プロジェクトを作成した後、ソリューション・エクスプローラから「Models」フォルダを右クリックし、表示されたコンテキスト・メニューから[新しい項目の追加]を選択すればよい。
[新しい項目の追加]ダイアログが表示されるので、テンプレートでは[ADO.NET Entity Data Model]を選択し、ファイル名は「MyMvc.edmx」と入力して、[追加]ボタンをクリックする。[Entity Data Modelウィザード]ダイアログが起動するので、以下の表2の要領で必要な情報を入力しておこう。
Entity Data Modelウィザードについては、別記事「.NETの新データアクセス・テクノロジADO.NET Entity Framework」の2ページ目が詳しいので、こちらも併せて参照いただくとよいだろう。
| 設定項目 | 設定/選択値 | 
|---|---|
| モデルに含めるコンテンツ | データベースから生成 | 
| アプリケーションがデータベースへの接続に使用するデータ接続 | MyMvc.mdf | 
| エンティティ接続設定の名前 | MyMvcEntities(デフォルト) | 
| モデルに含めるデータベースオブジェクト | [テーブル]−[Book]にチェック | 
| モデル名前空間 | MyMvcModel | 
| 表2 [Entity Data Modelウィザード]ダイアログの設定項目 | |
ウィザードが終了したときに、データベースの内容に基づいて、以下のようなADO.NETエンティティ・デザイナが表示されていれば、正しくデータ・モデルは作成できている。
なお、Entity Dataモデルを作成した後は、必ずメニューバーの[ビルド]−[ソリューションのビルド]でソリューションをビルドしておく必要がある。さもないと、後からビュー(=Webページを記述した.aspxファイルのスクリプト)を生成する際などにデータ・モデルが認識されないので、注意されたい。
次に、前回同様にModel−View−ControllerモデルのControllerを表すコントローラ・クラスを作成する。
コントローラ・クラスを作成するには、ソリューション・エクスプローラで「/Controllers」フォルダを右クリックし、表示されたコンテキスト・メニューから[追加]−[Controller]を選択する。これにより[Add Controller]ダイアログが表示されるところまでは前回と同じである。
今回は、コントローラ・クラスの名前として「BookController」を入力するだけでなく、ダイアログ下部の[Add action methods for Create, Update, and Details scenarios]にチェックを入れておこう。
[Add action methods for Create, Update, and Details scenarios]は、登録/更新/一覧/詳細機能のひな型を自動生成するかどうかを決めるための項目だ。この項目にチェックを入れておくことで、必要なアクション・メソッドの骨組みを自動的に作成できる。
[Add]ボタンをクリックすると、以下のようなコードが生成されていることが確認できるはずだ。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcAppCs.Controllers {
  public class BookController : Controller {
    //
    // GET: /Book/
    public ActionResult Index() {
      return View();
    }
    //
    // GET: /Book/Details/5
    public ActionResult Details(int id) {
      return View();
    }
    //
    // GET: /Book/Create
    public ActionResult Create() {
      return View();
    }
    //
    // POST: /Book/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection) {
      try {
        // TODO: Add insert logic here
        return RedirectToAction("Index");
      } catch {
        return View();
      }
    }
    //
    // GET: /Book/Edit/5
    public ActionResult Edit(int id) {
        return View();
    }
    //
    // POST: /Book/Edit/5
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection collection) {
      try {
          // TODO: Add update logic here
          return RedirectToAction("Index");
      } catch {
        return View();
      }
    }
  }
}
Public Class BookController
  Inherits System.Web.Mvc.Controller
  '
  ' GET: /Book/
  Function Index() As ActionResult
    Return View()
  End Function
  '
  ' GET: /Book/Details/5
  Function Details(ByVal id As Integer) As ActionResult
    Return View()
  End Function
  '
  ' GET: /Book/Create
  Function Create() As ActionResult
    Return View()
  End Function
  '
  ' POST: /Book/Create
  <AcceptVerbs(HttpVerbs.Post)> _
  Function Create(ByVal collection As FormCollection) As ActionResult
    Try
      ' TODO: Add insert logic here
      Return RedirectToAction("Index")
    Catch
      Return View()
    End Try
  End Function
  '
  ' GET: /Book/Edit/5
  Function Edit(ByVal id As Integer) As ActionResult
    Return View()
  End Function
  '
  ' POST: /Book/Edit/5
  <AcceptVerbs(HttpVerbs.Post)> _
  Function Edit(ByVal id As Integer, ByVal collection As FormCollection) As ActionResult
    Try
      ' TODO: Add update logic here
      Return RedirectToAction("Index")
    Catch
      Return View()
    End Try
  End Function
End Class
Indexアクションはデフォルトのページ(ここでは一覧画面)、Detailsアクションは詳細画面、Createアクションは新規登録画面、そして、Editアクションは編集画面に、それぞれ対応するアクション・メソッドである。
以下では、これらのアクション・メソッドに対して必要なコードを追加していく。
Copyright© Digital Advantage Corp. All Rights Reserved.