ASP.NET MVCでモデルを作る際のモデルの作り方について簡単にまとめた。
なお、EntityFrameworkを使用していることを前提として書く。
主な流れとしては、
Modelディレクトリの中に作成したいクラスを作る
↓
そのクラスでデータの詳細を作成
↓
DbContextクラスを継承したクラスの中に、そのテーブルを作成するような処理を書く
というものである。
1.クラス内でのプロパティの定義
public class ClassName{
public int Id { get; set; }...①
public string Name { get; set;}...②
}
①、②のようなものを「プロパティ」という。
アクセス修飾子 型名 プロパティ名 { get; set; }
の書き方がある。
○アクセス修飾子には
・public(どこからも参照できる)
・private(クラス内部でしか参照できない)
などが使われることが多い。
○型名は
・int(数値)
・string(文字)
・bool(論理値)
・DateTime(日付)
などがある。
○プロパティ名は必ず接頭辞を大文字にすること。
2.プロパティにいろんな設定をしたい場合
例えば、長さを指定したいとか、Viewで表示するときに指定した名前で表示したいとかそういうのがある場合は、「アノテーション」を指定する。(例)
public class ClassName{
public int Id { get; set; }...①
[Required]
[Index(IsUnique = true)]
[DataType(DataType.Password)]
public string Name { get; set; }...②
}
などのように書く。
よく使うアノテーションについては、以下の記事を参考に。
3.他のクラスと関連付けたい(n対mの関係にしたい)場合
例えば、 ○ドラクエのキャラクター(Chara)クラスpublic class Chara {
public int Id { get; set; }...①
public string Name { get; set;}...②
}
○キャラクターの職業(Job)クラス
public class Job {
public int Id { get; set; }...①
public string JobName { get; set;}...②
}
という2つのクラスがあったとして、この2つを関連付けたい場合、
アクセス修飾子 virtual <関連付けたいクラス名> プロパティ名 { get; set; }
というような書き方で指定する。
この時、プロパティ名は関連付けたいクラス名の副うす型にすることが多い。
また、関連付けたいものが今後増える可能性があるものは、
アクセス修飾子 virtual ICollection<関連付けたいクラス名> プロパティ名 { get; set; }
のよういに関連つけたいクラスをコレクションにする。
CharaとJobの場合だと、
public class Chara {
public int Id { get; set; }...①
public string Name { get; set;}...②
public virtual ICollection<Job> Jobs { get; set; }
}
public class Job {
public int Id { get; set; }...①
public string JobName { get; set;}...②
public virtual ICollection<Chara> Charas { get; set; }
}
となる。
4.DBにテーブルを作成する
作りたいModelの詳細が決まったら、Dbにテーブルを作成するためのクラス(コンテキストクラス)ファイルを作成する。例えば、そのコンテキストファイル名が「DqGameContext.cs」とすると、
public class DqGameContext {
}
という空のクラスができているので、
public class DqGameContext : DbContext {
}
とクラス名の後ろに「: DbContext」を追加する。
このようなクラスの後ろにクラス名をつけることを「継承」といい、これをすることで、別のクラスのメソッドなり、プロパティなりを継承したクラスでも使うことができる。
今回の場合だと、「DqGameContext」クラスが「DbContext」クラスの内容を継承していることになる。
そして、このクラス内で、
public class DqGameContext : DbContext {
public DbSet<Chara> Charas { get; set;}
public DbSet<Job> Jobs { get; set;}
}
と書き、ビルドすると、DBにCharaテーブルとJobテーブルが作成される
public DbSet<クラス名> プロパティ名(クラス名の複数形) { get; set; }
DBには、プロパティ名がテーブル名となって追加される。