データモデルの作成

データモデルの作成


コードファーストはデータモデル(コード)を定義することからまず始める。
 
例としてエンティティ(Article, Comment, Author)で考える。
【Article】 1 - n 【Comment】
【Article】 m - n 【Author】
 
[Models/Article.vb](エンティティ1)

 
[Models/Comment.vb] (エンティティ2)

 
[Models/Author.vb] (エンティティ3)

 
[Models/MvcModelContext.vb] (コンテキスト)

 
[Web.config]

※必要に応じてイニシャライザーで初期データを準備
arrow_down
[実行後に作成されるテーブル]
34
・コンテキスト名がデータベース名となる。
・データベースへの接続名はコンテキスト名となる。
・クラス(単数形)はテーブル(複数形)にマッピングされる。
 (ex. ArticleクラスとArticlesテーブルの関係)
・プロパティは同名のテーブル列にマッピングされる。
 (ex. AuthorクラスのNameプロパティとAuthorsテーブルのName列の関係)
・主キーはIdまたは[クラス名]Idという名前がデフォルト
・ナビゲーションプロパティは同名(単数形)のエンティティにマッピングされる。
 (ex. AuthorクラスのArticlesプロパティとArticleエンティティの関係)
 ※ナビゲーションプロパティ:他のエンティティとの関連を表すプロパティ
  (ArticleエンティティのComments・Authorsプロパティ、CommentエンティティのArticleプロパティ、
   AuthorエンティティのArticlesプロパティ)
   Overridableで修飾する必要がある。


1:nの関係(【Article】 1 - n 【Comment】)

Articleクラス側には、CommentsプロパティをICollection(Of Comment)型で用意する。
Commentクラス側には、ArticleプロパティをArticle型で用意する。
Commentsテーブルの方にだけArticle_Id列が自動生成される(ArticlesテーブルのId列を参照する外部キー)
 

m:nの関係(【Article】 m - n 【Author】)

Articleクラス側には、AuthorsプロパティをICollection(Of Author)型で用意する。
Authorクラス側には、ArticlesプロパティをICollection(Of Article)型で用意する。
中間テーブル[AuthorArticles]は自動で生成される。
  ・Author_Id列とArticle_Id列で主キー
  ・Author_Id列とArticle_Id列はともに外部キーでもある。


ナビゲーションプロパティを用意した場合、外部キー列は自動生成されるので意識する必要は無いが、
ナビゲーションプロパティとは別に外部キープロパティを明示的に定義した方がメリットがある。
[Models/Comment.vb] (エンティティ2)

この場合、Commentsテーブルの外部キーの列名はArticleIdとなる。


【関連エンティティへのアクセス】

ナビゲーションプロパティを介して、指定したIDの記事(Article)に対するコメント(Comment)を
列挙することも簡単に実現できる。

[Controllers/ArticlesController.vb]

[Views/Articles/Details.vbhtml]

arrow_down
[出力結果]
35


逆にコメント(Comment)を元に、親の記事(Article)を取得する場合は以下のとおり

[Controllers\CommentsController.vb]

[Views\Comments\Details.vbhtml]

arrow_down
[出力結果]
36