10月15日(火)1、2コマ目
今日、やったこと
- DBのリレーションをたどる
- [練習問題]練習問題3
- 検索アプリを作る
今日のホワイトボード
DBのリレーションをたどる
CS_商品マスタとCS_グループマスタを結合して、グループIDではなく、グループ名を表示したい。
![]() |
| 図 グループIDをグループ名に変更 |
2つのテーブル間のリレーションシップと同じように、Itemクラスに結合するGroupクラスのインスタンスを格納するGroupプロパティを追加。このプロパティをナビゲーションプロパティと呼ぶ。
![]() |
| 図 ItemクラスにGroupプロパティを追加 |
ソースコードをあげておきます。
appsettings.json
DB接続文字列を設定。以前と同じ。
Models/Group.cs
CS_グループマスタに対応するクラス。
Models/Item.cs
CS_商品マスタテーブルに対応するクラス。
ナビゲーションプロパティ"Group"経由で結合すべきGroupクラスのインスタンスにアクセスできる。
Data/SampleDbContext.cs
CS_グループマスタにアクセスするためのGroupsプロパティ、CS_商品マスタにアクセスするためのItemsプロパティがある。
Controllers/SearchController.cs
アクションメソッドAll()にて、CS_グループマスタ、CS_商品マスタ検索結果を取得。
取得した検索結果はViewData経由でビューに渡す。
Views/Search/All.cshtml
ViewData経由で渡された検索結果を表示。
Program.cs
DI機能でSampleDbContextのインスタンスを生成。
以前と同じ。
[練習問題]練習問題3
練習問題2で使った3つのテーブルを結合した結果を表示する。
正解例をあげておきます。
Models/Maker.cs
メーカーマスタに対応するクラス。
Models/Genre.cs
製品ジャンルマスタに対応するクラス。
Models/Camera.cs
製品マスタに対応するクラス。
参照するメーカーマスタ、ジャンルマスタのためのMakerプロパティ、Genreプロパティがある。
Data/SearchDbContext.cs
練習問題2と同じ。
Controllers/CameraController.cs
製品マスタだけを取得(Camerasプロパティだけアクセス)しても、参照するメーカーマスタ、製品ジャンルマスタを取得できない。
その1 3つのテーブルをすべて取得
Index()メソッドにて、製品マスタを全件検索(SearchDbContextのCameraプロパティアクセス)。この段階では参照先のデータは未取得。
メーカーマスタ、ジャンルマスタも全件検索(Makersプロパティ、Genresプロパティにアクセス)すれば製品マスタが参照するデータも取得できる。
![]() |
| 図 DbContextのプロパティ |
その2 Include()で不足データを取得
製品マスタが参照するメーカーマスタ、ジャンルマスタをInclude()で取得する。
![]() |
| 図 Include()メソッドで不足するデータを取得 |
Views/Camera/Index.cshtml
ViewData経由で渡された製品一覧を表示。
appsettings.jsonやProgram.csは今までと同じ。
検索アプリを作る
今まで違うのはボタンをクリックしたときの処理。
HTTPのGETコマンドではなく、POSTコマンドでリクエスト
パラメータはクエリパラメータ、パスパラメータではない
![]() |
| 図 今までとの違い |
途中まで作りました。ソースコードをあげておきます。
Models/Group.cs
CS_グループマスタに対応するクラス。
Models/Item.cs
CS_商品マスタに対応するクラス。
ナビゲーションプロパティGroupでリレーションをたどってグループ情報を取得
Data/SearchDbContext.cs
今までと同じ。
Controllers/SearchController.cs
とりあえず http://xxxx/Search でアクセスするとグループ一覧が選択できるようにした。
Views/Search/Index.cshtml
とりあえず http://xxxx/Search でアクセスするとグループ一覧が選択できるようにした。
次回は
検索アプリのつづき。
グループを選択したら、選択グループの商品を検索できるように改造。




