情報応用演習Ⅰ(2024)

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

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

5a-5. データベースへの反映

これからデータベースに作成したデータモデルを反映させるが,そのまえに Entity Framework Core Code First における データモデルの管理について簡単に説明しておこう.

まず理解しなければならないことの一つは モデルクラスの定義は不変ではない ,ということである. アプリケーションの成長に伴ってモデルクラスにデータ(≒プロパティ)が追加されたり削除されたり,もしくは別のモデルクラスを 扱う必要が生じたり,といったことはしばしば生じる.このようなモデルクラス群の変更のたびに 古いテーブル定義を新しいテーブル定義にすり合わせる 必要が生じる.このようなデータベースの変更処理は 一般的に データベースマイグレーション とかもしくは単に マイグレーション (migration)と呼ばれる.

Entity Framework Core では,このマイグレーションのためのプログラムコードは dotnet ef migrations add」コマンド で 生成する.基礎的なすり合わせ処理は自動生成することが可能だが,データベース内の既存データを 新しいテーブル定義にすり合わせる(変換する)方法はプログラマーが手動で指示する必要がある場合も多い. このコマンドで生成したマイグレーション処理は dotnet ef database update」コマンド で,実際にデータベースサーバ側に 反映させることができる.必要な場合はこのコマンドを使って古いテーブル定義に差し戻すことも可能である. _はこのデータベース管理のサイクルを示している.

Entity Framework Core におけるデータベース管理

マイグレーション処理は場合によっては慎重なコード設計を必要とすることもあるが, 今回は最初に定義したモデルクラスのみを使用するため手動でマイグレーション処理を記述する必要はない. モデルクラスの変更やマイグレーション処理を手動で記述する例は後日説明することにする. それでは実際にマイグレーション処理の生成とデータベースの反映を試してみよう.

Visual Studio 上でコマンドラインターミナル1を開き_に示すコマンドを実行しよう.

なおこれらのdotnet ~というコマンドを実行する際は, カレントディレクトリを操作対象のプロジェクトのプロジェクトフォルダに変更する必要がある .今回の場合はあらかじめcd プロジェクト名を実行しておく必要がある.カレントディレクトリの概念や確認方法,cdコマンドの使用方法などは2年次の情報基礎演習で学んでいるはずであるためここでの説明は割愛する.

また,このコマンドを実行する前に一度以上プロジェクトをビルドしておく必要がある.また,ソリューションに含まれるプロジェクトに1つでもコンパイルエラーがあるとこのコマンドは失敗することがある.このためこのコマンドを実行する際は,事前にソリューション全体を一度ビルドして一つもコンパイルエラーがないことを確認しておくこと.

マイグレーション処理の生成と実行
PS> dotnet ef migrations add InitialDB
PS> dotnet ef database update
黄色文字のメッセージが表示される場合は

dotnet ef ~ コマンドを実行した際に_に示すようなメッセージが表示される場合がある.

dotnet ef ~ コマンドを実行した際に表示されることがあるメッセージ

たとえば_では以下のように表示されている. 以前に説明したようにこのようなメッセージは 無視せずに一読して対応を考えるべきである.

The Entity Framework tools version '6.0.1' is older than that of the runtime '6.0.2'. Update the tools for the latest features and bug fixes. See https://aka.ms/AAc1fbw for more information.

これを訳すならば以下のようになる.

Entity Framework ツールのバージョン '6.0.1' はランタイム '6.0.2' より古い. 最新の機能とバグフィックスのためツールをアップデートせよ.詳しくは https://aka.ms/AAc1fbw を参照せよ.

読んでの通りであるが,リンク先には Entity Framework ツールの更新方法が記載されている(_).

リンク先のページ

指示に従って Entity Framework ツールをアップデートしよう.コマンドラインターミナル1_に示すコマンドを実行する.

Entity Framework ツールのアップデート
PS> dotnet tool update --global dotnet-ef

ツール 'dotnet-ef' がバージョン '6.0.1' からバージョン '6.0.2' に正常に更新されました。」のように表示されれば完了である.

黄色文字のメッセージが表示される場合は : 閉じる

_の説明をしておこう.dotnet ef migrations add コマンドの使い方は dotnet ef migrations add マイグレーション処理の名前となる. 各マイグレーション処理には 名前を付ける必要がある が,マイグレーション処理の名前の部分がその名前である. このマイグレーション処理の名前は適当に意味の分かりやすい名前をつければよいが,今回はInitialDBという名前を使用している. dotnet ef database updateコマンドは,作成された最新のマイグレーション処理を反映させる場合には特に引数を指定する必要はない.

_を実行すると_のように表示され,プロジェクトに Migrations フォルダが追加される(_). このフォルダには dotnet ef migrations add コマンドで指定したマイグレーション処理の名前をファイル名に含む .cs ファイルが含まれる. 今回の場合はコマンドを実行した日時_InitialDB.csというファイルが生成されているはずである. このファイルの中身を見てみよう._に示すように,Up()という名前のメソッドとDown()という名前のメソッドを含む マイグレーション処理の名前と同じ名前のクラスが定義されているはずである.

マイグレーション処理の生成と実行の結果

このUp()メソッドが古いテーブル定義を新しいテーブル定義にすり合わせる処理であり,Down()メソッドがその逆を行うメソッドである. 今回はデータベースが空の状態からのマイグレーション処理であるため,Studentsという名前のテーブルを作成するコードが含まれている. このマイグレーション処理で用いられているAPIの詳細については省略するが,.CreateTable()というメソッドが呼び出されており, おおむね「テーブルの作成が行われている」ということがことがわかるだろう.

_を実行したら pgAdmin で,実際にデータベースとテーブルが作成されていることを確認しておこう. pgAdmin を起動する. pgAdmin がすでに起動中の場合は,「Servers」→「PostgreSQL 16」→「Databases」を右クリックして「Refresh」を実行する. 「Databases」に表示される データベースの一覧に「t5a_db」が存在していることを確認しておこう(_). また,データベース「t5a_db」以下を展開すると, 「t5a_db」→「Schemas」→「public」→「Tables」にテーブル「Students」が存在してることを確認する(_). ちなみに「__EFMigrationHistory」という名前のテーブルも追加されているが,これはマイグレーション処理のための管理情報を保持するテーブルである. このテーブル「Students」を右クリック→「Properties」をクリックし(_),表示された子ウインドウの「Columns」タブを表示させてみよう. リスト5a-3-6Studentsクラスの各プロパティに対応する列が定義されていることが分かるだろう(_).

生成されたデータベースの確認

ここまで確認できたら1つ目のチュートリアルは完了である.次節ではこのデータモデルを操作するためのコントローラーをおよびビューを作成する. 次に進む前に,混乱を防ぐため Visual Studio のエディタをすべて閉じておこう.Visual Studio のいずれかのエディタのタブを右クリックして 「すべててのドキュメントを閉じる」をクリックすれば,エディタをすべて閉じることができる


  1. タブのタイトルは「開発用PowerShell」もしくは「Developer PowerShell」となっている. ↩︎ ↩︎

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

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