SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法

ASP.NET 4.5の「Scaffolding(スキャフォールディング)」機能を試す(前編)

実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

生成元コード作成

 最初に、コードを生成する元となるデータモデルクラスとDbContext派生クラスを作成します。

データモデルの作成

 コード生成の元となるデータモデルのクラスです。Modelsというフォルダーをプロジェクトに作成し、そこにLocationという名前のクラスを新たに作成してください(リスト1)。

リスト1 場所のデータモデル(Models\Location.cs)
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に再掲します。

表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)。

リスト2 DbContext派生クラス(Models\MRRSContext.cs)
using System;
using System.Data.Entity;

namespace MRRS_Scaffolding.Models
{
  public class MRRSContext : DbContext
  {
  }
}
DbContextクラス

 DbContextクラスとは、Entity Frameworkを用いたデータアクセスの基本となるクラスです。複数のテーブルをまたがった追加、変更、削除といった「トランザクション」を管理するためのクラスで、いわゆる「ユニット・オブ・ワーク(Unit of work)」パターンの実装です。

 

 DbContextクラスの派生クラスに、操作対象のテーブルに対応したDbSet<T>型のプロパティを配置し、そのDbSet<T>型プロパティに対して追加、変更、削除などを行った後、DbContextクラスに用意されたSaveChagesメソッドを呼び出すことで、トランザクションを確定させます。詳しくは以下の記事などを参照ください。

 

次のページ
コード生成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7491 2013/11/26 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング