【T7b】複数のモデルクラスの連携(6/9)
プロジェクトタイプ | (注意: 本文参照) |
---|---|
プロジェクト名 | T7b |
ソリューション名 | PIT7 |
注意
- 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
- 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
- プロジェクトの作成作業については準備作業を参照せよ.
7b-6. EF Core におけるデータシーディング
一般的なウェブアプリでは,アプリケーションの実行前に あらかじめ決めうちのデータを用意する 必要に迫られる場面が多々ある. データベースの用語でいえばいわゆる「マスターデータ」の準備である.このようなデータを用意する処理のことを EF Core では データシーディング (data seeding)という.EF Core におけるデータシーディングの方法はいくつか用意されている. 詳細はData Seeding - EF Core - Microsoft Docs に説明を譲るが,本節ではデータコンテキストクラスを用いた方法を紹介する.
本チュートリアルで,データコンテキストクラスとして使用しているT7bContext
クラスは
DbContextクラスから派生させた型である.
このクラスにはOnModelCreating()
というオーバーライド可能なメソッドが定義されている.このメソッドはデータコンテキストクラスのインスタンスが作成される際に実行されるものであるが,
この中でデータシーディング処理を実行することができる. Data/T7bContext.cs に_に示す内容を追記してみよう. クラス定義内で override キーワードを入力するとオーバーライド可能なメソッドの一覧が表示される .ここからOnModelCreating()
メソッドを選択すれば,コード補間によってメソッドの大枠は自動的に追記されるので,そのうえで_の強調部分のみを入力すればよいだろう.
|
|
modelBuilder
のEntity<
メソッドを呼び出している.このメソッドは
モデルクラス名
>()モデルクラス名
で指定したモデルクラスのための設定を行うオブジェクト1を返す.このオブジェクトはHasData()というメソッドを持っている.このメソッドにはモデルクラス名
で指定したクラスのオブジェクトか,
もしくはその配列を指定することができる.このメソッドの引数はparams引数なので_では,配列を直接作って渡す代わりにカンマ区切りで複数のDepartment
のインスタンスを指定している.このメソッドに渡されたオブジェクトは必ず存在することが確約される.
ここまで追記ができたら,コマンドラインターミナル2で_に示すコマンドを実行して, マイグレーション処理の生成と適用を行おう.
PS>
dotnet ef migrations add AddDepartment_part1PS>
dotnet ef database update
実行したら pgAdmin でデータベースの変化も見てみよう. pgAdmin を起動する. pgAdmin がすでに起動中の場合は, 「 Servers 」→「 PostgreSQL 16 」→「 Databases 」を右クリックして「 Refresh 」を実行する. 「 Databases 」→「 t7b_db 」→「 Schemas 」→「 public 」→「 Tables 」に,新たなテーブル「 Departments 」が 追加されていることを確認する(_).また,「 t7b_db 」を右クリックして「 Query Tool 」を起動して, Departments テーブルの全内容を表示するSQL文を実行してみよう._に示すように, _で追加した3つの学科の情報が追加されていることが分かるはずである.
ここまでで前節で説明した分割したマイグレーション処理の一つ目「1.Department
クラスの追加」の処理が完了した.
次に二つ目の処理である「2.Student
クラスへのDepartmentId
プロパティの追加」のための変更を行おう.
さきほどリスト7b-5-7でコメントアウトしたStudent
クラスの外部キープロパティとナビゲーションプロパティをアンコメント3して,コマンドラインターミナル2で_に示すコマンドを実行しよう.
PS>
dotnet ef migrations add AddDepartment_part2
_のコマンドによって, Migrations フォルダに
が生成される.生成されたマイグレーションコードは_のようになっているはずある.なおコメントは筆者による.
もし,_ のようになっていない場合は,ここまでの操作を間違えている可能性がある.
手順を見直し適切に修正すること .決して,_のコードを手打ちするなどしてつじつまを合わせてはならない.コマンドを実行した日時
_AddDepartment_part2.cs
![](https://book.knzw.page/pit1_2024/c2i/csharp_65bdaeed290f929e24eb8f78c958b0c2.png)
_のUp()
メソッドの処理内容は①Students
テーブルにDepartmentId
列を追加し,
②その新たに追加した列に外部キー制約を追加することであるが,①と②の処理のあいだ,すなわち強調した★の行の部分に
_に示す内容を追記しよう.
|
|
この追記部分では,Sql()
メソッドをつかってUPDATE文を実行している4.既存の学生データのDepartmentId
には
決め打ちで1
という値をセットしている.これはすべての学生を学科IDが1である学科,つまり「医療情報学科」に
所属させるということに相当する.この処理方法の適切性については疑問を持つ読者もいるだろう.
最初にサービスインした時点では「学科」を管理する予定がなかったため, 「どの学生がどの学科に所属しているか」という
情報は既存のデータベース内のどこにも記載されていない .このためとりあえず決め打ちで特定の学科に所属させている.
各学生と学科の対応情報が別で分かっている場合には,それをもとに在籍する学科を特定してセットする方法もあるだろう.
_の追記ができたら,コマンドラインターミナル2で_に示すコマンドを実行して, マイグレーション処理を適用しよう.
PS>
dotnet ef database update
実行したら pgAdmin で Students テーブルの全内容を確認しておこう.DepartmentId
列が追加されて,
そのすべての行の値が1
になっているはずである(_).
ここまでで前節で説明した分割したマイグレーション処理の二つ目「2.Student
クラスへのDepartmentId
プロパティの追加」が完了した.
ただし,ここまでの変更ではデータモデルを変更しただけであって,学生データの登録や編集時に「学科」を入力することを考慮していない.
次節では「学科」の表示と入力のためのビューの変更を行う.
タブのタイトルは「開発用PowerShell」もしくは「Developer PowerShell」となっている. ↩︎ ↩︎ ↩︎
コメント解除すること ↩︎
MigrationBuilderクラスは既存レコードを更新するためのメソッドであるUpdateData()メソッドを備えているが,このメソッドは主キーを指定して特定のレコードのみを更新するメソッドである.そのため今回の様に既存の全データを一斉に更新するには今のところ
Sql()
メソッドによってUPDATE文を実行するしかない. ↩︎