連載:ASP.NET MVC入門【バージョン3対応】

第2回 Entity Frameworkコード・ファーストでモデル開発

山田 祥寛(http://www.wings.msn.to/
2011/04/21
Page1 Page2 Page3

 本連載では、MVCモデルをベースとした.NET Frameworkの新たなアプリケーション・フレームワーク「ASP.NET MVC」を基礎から解説している。前回は、Model−View−Controllerのうち、主に「View」「Controller」について解説した。今回は残る1つである「Model」を中心に、簡単なデータベース連携アプリケーションを作成してみよう。

 なお、前回の解説の後、Visual Studio 2010(以降、VS 2010)に新たな機能を追加する「ASP.NET MVC 3 Tools Update」がリリースされている。本連載でもこのUpdate版をベースに説明を進めていくので、まだインストールされていないという方は、「ASP.NET MVC: The Official Microsoft ASP.NET Site」から入手&導入しておくことをお勧めする。

[Note]ASP.NET MVC 3 Tools Updateの新機能

 ASP.NET MVC 3 Tools Updateでは、Tools Updateという名前のとおり、開発環境としての修正が行われている(ASP.NET MVCのコア部分である「System.Web.Mvc.dll」そのものには変更ない)。以下に、主な変更点を挙げておこう。

(1)Windows認証に対応したプロジェクト・テンプレート

 プロジェクト・テンプレートとして、Windows認証に対応した[Intranet Application]が追加された(従来からある[Internet Application]はフォーム認証が前提)。また、プロジェクト作成時にHTML5対応のマークアップを有効にするかどうかを選択できるようになった。


図1 [New ASP.NET MVC 3 Project]ダイアログ
  Windows認証に対応した[Intranet Application]テンプレート。
  HTML5対応の要素を利用するかどうかを選択。

(2)コントローラ作成のオプションを強化

 コントローラ作成のダイアログが大幅に強化された。具体的には、先日リリースされたばかりの「Entity Framework 4.1 Code First」に対応したコントローラ、ビュー・スクリプトの自動生成が可能になった。これについては、後から詳しく解説する予定だ。

(3)デフォルトで組み込まれるJavaScriptライブラリをバージョンアップ

 jQuery 1.5.1、jQuery UI 1.8.11、jQuery Validation 1.8、Modernizr 1.7が、デフォルトで組み込まれるようになった。Modernizrは、ブラウザのHTML5/CSS3への対応状況を確認するためのライブラリである。

Entity Framework 4.1のインストール

 ASP.NET MVC 3 Tools Updateとほぼ時を同じくして、Entity Frameworkの新バージョン「4.1」もリリースされている(Entity Frameworkの基本については、別連載「ADO.NET Entity Framework入門」も参照されたい)。ASP.NET MVC 3 Tools UpdateでもEntity Framework 4.1を強く意識した機能強化が行われているので、本連載でもこれを前提とした開発を行っていきたい。

 Entity Framework 4.1の目玉は、何といっても「コード・ファースト」だ。従来、Entity Frameworkでは、既存のデータベースから概念モデル(Entity Data Model)を生成する「データベース・ファースト」な開発、あるいは、概念モデルからデータベースを生成する「モデル・ファースト」な開発が主流であった。いずれの場合も、概念モデルの作成がまず、Entity Frameworkによる開発の基点となっていたわけだ。

 しかし、Entity Framework 4.1のコード・ファースト開発では、開発者はEntity Data Modelから解放される。Entity Data Modelや実際のデータベースのテーブルは、C#やVB(Visual Basic)で定義したモデル・クラスから自動的に生成されるのだ。

 また、特定のクラスに依存しないPOCO(Plain Old CLR Objects)でモデル・クラスを定義できるようになった。これによって、モデル・クラスがよりクリーンになり、単体テストも行いやすくなった。

 Entity Framework 4.1は、前回も説明したNuGetを利用することで、インストールが可能だ。[Package Manager Console]ウィンドウから以下のコマンドを実行すればよい。ソリューション・エクスプローラから[参照設定]に「Entity Framework」が追加されていることも確認しておこう。

PM> Install-Package EntityFramework
NuGetでEntity Framework 4.1をインストールするためのコマンド
[Package Manager Console]ウィンドウから実行する。

モデル・オブジェクトを作成する

 それではさっそく、具体的なサンプル・アプリケーションを作成していこう。

 今回、作成するのはBooksテーブルから取り出した書籍情報を一覧表示する、ごく簡単なデータベース連携のページである。誤解のないごくシンプルなサンプルを作成する中で、ASP.NET MVCにおけるモデル開発の基本的な流れを理解していただきたい。


図2 本稿で作成する書籍情報の一覧ページ

 ASP.NET MVC + Entity Frameworkコード・ファーストの世界では、大まかに以下の手順で開発を進めていくのが基本だ。

  • モデル・クラス(=エンティティ)の定義
  • コンテキスト・クラスの定義
  • イニシャライザの準備
  • コントローラ、ビューの作成

 モデル開発の世界では、どうしてもASP.NET MVCそのものというよりも、Entity Frameworkの解説が中心になってしまうが、少し我慢してお付き合いいただきたい。

 それでは、まずはモデル・クラス(=エンティティ)の記述から始めよう(コードを最初に、というわけだ)。

 具体的には、プロジェクト内の/Modelsフォルダの配下に、書籍情報を表すためのBookクラスと、これに1:nの関係で関連付いたReviewクラス(レビュー情報)を定義する(リスト1、2)。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace MvcApp.Models
{
  public class Book
  {
    [Key]
    public string Isbn { get; set; }i // ISBNコード
    public string Title { get; set; }i // 書名
    public int? Price { get; set; } // 価格
    public string Publish { get; set; } // 出版社
    public DateTime Published { get; set; } // 刊行日

    public virtual ICollection<Review> Reviews { get; set; } // レビュー
  }
}
Imports System.ComponentModel.DataAnnotations

Public Class Book
  <Key()>
  Public Property Isbn() As String ' ISBNコード
  Public Property Title() As String ' 書名
  Public Property Price() As Integer? ' 価格
  Public Property Publish() As String ' 出版社
  Public Property Published() As DateTime ' 刊行日

  Public Overridable Property Reviews() As ICollection(Of Review) ' レビュー
End Class
リスト1 書籍情報を表すエンティティ(上:Book.cs、下:Book.vb)

using System;

namespace MvcApp.Models
{
  public class Review
  {
    public int ReviewId { get; set; } // レビューID
    public string Title { get; set; } // レビュータイトル
    public string Body { get; set; } // レビュー本文
    public DateTime CreatedAt { get; set; } // 投稿日
  }
}
Public Class Review
  Public Property ReviewId() As Integer ' レビューID
  Public Property Title() As String ' レビュータイトル
  Public Property Body() As String ' レビュー本文
  Public Property CreatedAt() As DateTime ' 投稿日
End Class
リスト2 レビュー情報を表すエンティティ(上:Review.cs、下:Reviws.vb)

 Entity Frameworkのコード・ファースト開発で、最初に知っておかなければならない規則はごくわずかで、また、シンプルなものだ。

  • クラス(単数形)は、同名のテーブル(複数形)にマッピングされる
  • プロパティは、同名のテーブル列にマッピングされる
  • 主キーは、Id、または<クラス名>Idという名前がデフォルト(例:ReviewId)
  • 上記以外の主キーを定義するには、Key属性(System.ComponentModel.DataAnnotations名前空間)を付けてプロパティを定義する(例:Isbn)
  • nullを許容する値型の列は、null許容型で指定する(例:Price)
  • ナビゲーション・プロパティは、同名のエンティティにマッピングされる(例:Reviews)

 ナビゲーション・プロパティとは、あるエンティティと関連(アソシエーション)を持った、別のエンティティを参照するためのプロパティのこと。

 本稿のサンプルであれば、Bookエンティティで定義されたReviewsプロパティがそれだ。BookエンティティとReviewエンティティとは1:nの関係にあるので、ナビゲーション・プロパティはICollection<エンティティ>型であり、名前もReview“s”と複数形になる点にも注目してほしい。

 また、ナビゲーション・プロパティがvirtualキーワードで修飾されている点にも注目だ。エンティティ上でvirtualキーワードの付いたプロパティは、それが遅延ロードされることを表す。つまり、明示的に該当するプロパティにアクセスするまで、参照先の値(ここでは関連付いたReviewsテーブルの値)はデータベースから取得されない。

 Entity Frameworkのアソシエーションやナビゲーション・プロパティについては、別稿「EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存」でも詳説しているので、併せて参照いただきたい。

 

 INDEX
  ASP.NET MVC入門【バージョン3対応】
  第2回 Entity Frameworkコード・ファーストでモデル開発
  1.EF 4.1のインストール/モデル・オブジェクトを作成する
    2.コンテキスト・クラス/DB接続文字列の準備/イニシャライザ
    3.スキャフォールディング機能を利用しよう/サンプルの実行
 
インデックス・ページヘ  「ASP.NET MVC入門【バージョン3対応】」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間