情報応用演習Ⅰ(2024)

【T5a】モデルとデータベースの連携(前編)(3/5)

プロジェクトタイプASP.NET Core Web アプリ(Model-View-Controller)
プロジェクト名T5a
ソリューション名PIT5
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)
注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については準備作業を参照せよ.

5a-3. モデルクラスの作成

最初にアプリ内で管理するモデルクラスを作成することにしよう. このアプリでは「学生」に関する情報を管理する.このアプリで管理するデータは唯一これのみで 他のいかなる実体も含まない.この「学生」の情報には_に示す項目を含めることにしよう.

「学生」の情報
項目名必須/任意データ型備考
ID必須整数学生の通し番号
必須文字列上の名前.
必須文字列下の名前.
性別必須列挙型性別.
電話番号必須文字列連絡先の電話番号.必須.
メールアドレス任意文字列メールアドレス(携帯電話などの学外のメールアドレス).
誕生日任意日付誕生日(日付部分のみ).登録は任意であることにする.
登録日時必須日付時刻その学生をシステムに登録した日時(日付と時刻を含む).

まずはこの「学生」に対応するモデルクラスを定義しよう.クラス名は「学生」を単純に 英訳して Student とする.まずプロジェクト内の Models フォルダを右クリックし,「追加」→「クラス」をクリックする. 作成するクラス名を訊かれるのでStudent(.csは省略可能)と入力して「追加」ボタンをクリックする. すると空のクラス定義が作られるので_の定義を書き込もう.

「学生」クラス
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// ISO/IEC 5218 に基づく性別型
public enum SexType
{
    NotKnown      = 0, // 不明
    Male          = 1, // 男性
    Female        = 2, // 女性
    NotApplicable = 9, // 適用不可
}

// 「学生」クラス
public class Student
{
    public int       Id { get; set; }          // ID

    public string    LastName { get; set; }    // 姓
    
    public string    FirstName { get; set; }   // 名

    public SexType   Sex { get; set; }         // 性別

    public string    PhoneNumber { get; set; } // 電話番号
    
    public string    Mail { get; set; }        // メールアドレス
    
    public DateTime  Birthday { get; set; }    // 誕生日

    public DateTime  Registered { get; set; }  // 登録日時
}

人物にかかわる情報を扱う際に「性別」の情報を定義しなければならない場面は多々あるが, ここではそのための列挙型SexTypeを定義している.ちなみに性別をコンピューターシステムで表現する 方法には ISO - ISO/IEC 5218:2004 - Information technology — Codes for the representation of human sexes という国際工業規格がある._SexType列挙型はそれに基づくものである.

「学生」クラスは_に示した項目をすべて含んでいるが,必須や任意といった制限事項や, 例えばその文字列型のプロパティが,文字列は文字列でも どのようなデータの容れ物なのか,すなわち電話番号やメールアドレス,またはパスワードなのか, といった情報が含まれていない.また前節でも登場した表示名も現れていない.このような制限やメタデータは前節で説明した通り プロパティの型や属性によって表現する必要がある.それではこのプレーンなStudentクラスに, そのような制限やメタデータを追加していこう.

まずは必須/任意といった制限から反映させていこう.ASP.NET Core ではプロパティの型が null を代入可能な型かそうでないかによって 必須/任意を識別する._のプレーンなクラス定義では,すべてのプロパティはNull非許容であるためすべての プロパティが必須の項目となっている._によれば「メールアドレス」や「誕生日」の項目は任意であるため これらの部分が食い違ってしまう.そのプロパティを任意の項目に設定するには,そのプロパティの型を Null許容型に,つまり型名に?をつける必要がある.これを踏まえてStudentクラスを_のように変更しよう.

「学生」クラスの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 「学生」クラス
public class Student
{
    public int       Id { get; set; }                // ID

    public string    LastName { get; set; } = "";    // 姓
    
    public string    FirstName { get; set; } = "";   // 名

    public SexType   Sex { get; set; }               // 性別

    public string    PhoneNumber { get; set; } = ""; // 電話番号
    
    public string?   Mail { get; set; }              // メールアドレス

    public DateTime? Birthday { get; set; }          // 誕生日

    public DateTime  Registered { get; set; }        // 登録日時
}

「メールアドレス」に対応するMailプロパティ,それから「誕生日」に対応するBirthdayプロパティをNull許容型にした. Null許容型は任意の項目となり,それ以外のNull非許容な型のプロパティはデータベースのテーブル上でもIS NOT NULL制約が付加される. また,それ以外のNull非許容な参照型のプロパティであるLastNameFirstNamePhoneNumberプロパティには デフォルト値として空文字列("")を指定している(Null非許容参照型のプロパティにはなんらかの初期値を指定しておく必要がある).

つぎにデータ型の詳細について指定することにしよう.「メールアドレス」や「電話番号」はともに文字列型のプロパティであるが, これらに格納されるデータの内容について注釈を行うことで様々な最適化が行われることが期待できる. また,「誕生日」や「登録日時」はともにDateTime型のプロパティであり,DateTime型は日付と時刻の両方の情報を含む型であるが, 前者は時刻を含まない日付のみの項目,後者は日付と時刻込みの項目である.これらに関しても注釈が必要である1. このように同じ型であってもその格納内容に特別な意味付けがある場合は,_に示すような 属性を適用することでデータの意味付けを注釈することが可能である.なお,_は使用可能な属性の一部である. これらの属性を指定することによって,そのデータを格納するデータベースのテーブルの列にそれに適したデータ型が選択されたり, これらのデータを入力するためのフォームの入力欄でそれらに適した入力補助が表示される,といった効果がある.

データ内容の注釈のための属性(一部)
属性意味
[EmailAddress]Eメールアドレスを表す.
[Phone]電話番号を表す.
[DataType(DataType.Date)]日付を表す.
[DataType(DataType.DateTime)]日付と時刻を表す.
[DataType(DataType.Text)]テキストを表す.
[DataType(DataType.MultilineText)]複数行テキストを表す.
[DataType(DataType.Html)]HTMLを表す.
[DataType(DataType.Password)]パスワードを表す.

「電話番号」,「メールアドレス」,「誕生日」,「登録日時」のプロパティに上述のような属性を適用してみよう. このためにはまず_に示すusingディレクティブをソースコードの冒頭に追記してから, Studentクラスを_のように変更しよう.

必要なusingディレクティブ
1
using System.ComponentModel.DataAnnotations;
「学生」クラスの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 「学生」クラス 
public class Student
{
    public int Id { get; set; }                   // ID

    public string LastName { get; set; } = "";    // 姓

    public string FirstName { get; set; } = "";   // 名

    public SexType Sex { get; set; }              // 性別

    [Phone]
    public string PhoneNumber { get; set; } = ""; // 電話番号

    [EmailAddress]
    public string? Mail { get; set; }             // メールアドレス

    [DataType(DataType.Date)]
    public DateTime? Birthday { get; set; }       // 誕生日

    [DataType(DataType.DateTime)]
    public DateTime Registered { get; set; }      // 登録日時
}

仕上げとしてこのモデルクラスのすべてのプロパティの表示名を指定しておこう.表示名は前節で説明したように, プロパティに[Display]属性を付与することで指定することができる.Studentクラスを_のように変更しよう.

「学生」クラスの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 「学生」クラス
public class Student
{
    [Display(Name = "ID")]
    public int Id { get; set; }                   // ID
    
    [Display(Name = "姓")]
    public string LastName { get; set; } = "";    // 姓
    
    [Display(Name = "名")]
    public string FirstName { get; set; } = "";   // 名
    
    [Display(Name = "性別")]
    public SexType Sex { get; set; }              // 性別
    
    [Phone]
    [Display(Name ="電話番号")]
    public string PhoneNumber { get; set; } = ""; // 電話番号
    
    [EmailAddress]
    [Display(Name = "メールアドレス")]
    public string? Mail { get; set; }             // メールアドレス
    
    [DataType(DataType.Date)]
    [Display(Name = "誕生日")]
    public DateTime? Birthday { get; set; }       // 誕生日
    
    [DataType(DataType.DateTime)]
    [Display(Name = "登録日時")]
    public DateTime Registered { get; set; }      // 登録日時
}

ついでに 列挙型の表示名も指定しておこう[Display]属性は列挙型内の値にも指定することが可能である. SexTyp列挙型にも_のように[Display]属性を指定しよう.

SexType列挙型の変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// ISO/IEC 5218 に基づく性別型
public enum SexType
{
    [Display(Name = "不明")]
    NotKnown      = 0, // 不明
    [Display(Name = "男性")]
    Male          = 1, // 男性
    [Display(Name = "女性")]
    Female        = 2, // 女性
    [Display(Name = "適用不可")]
    NotApplicable = 9, // 適用不可
}

以上はモデルクラスの定義は完了である.次節ではこのクラスをもとにテーブル定義を作成する方法を学ぶ.


  1. .NET 6 以降ではDateOnly構造体TimeOnly構造体といったデータ型が追加されているため,これを用いる方法もある. ↩︎

Last updated on 2024-05-10
Published on 2024-05-10

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.