データベースのマイグレーションを行う
モデルクラスやデータベースコンテキストの作成は行いましたが、データベースそのものはまだ作成されていません。データベースの作成は、マイグレーション(migration)という作業で行います。マイグレーションとは移住といった意味で、ソフトウェア開発の世界ではある環境から別の環境へのプログラムやデータの移行を指します。
データベースにおいては、モデルクラスで定義されたプロパティをもとに、データベースのテーブル定義を行う作業を意味します。モデルの定義とテーブルの定義をそれぞれ行うのではなく、モデルの定義だけを行えばテーブルの定義は自動化されるので、データベースを直接触る必要もなく、アプリケーション開発が効率化されます。
では、マイグレーションを行いましょう。マイグレーションは、2つのステップで行います。マイグレーションファイルの作成と、それによるデータベースへの反映です。それぞれ、dotnet ef migrationsコマンドとdotnet ef databaseコマンドで行います。以下のコマンドをプロジェクトのルートフォルダにて実行してください。
% dotnet ef migrations add InitialCreate …略… % dotnet ef database update …略…
dotnet ef migrationsコマンドの引数InitialCreateは任意です。これが、マイグレーションファイルの名前に使われます(Migrations/20220310123532_InitialCreate.csなど)。何を目的としたマイグレーションファイルなのかわかるような名前にすると良いでしょう。
なお、マイグレーションファイルはプロジェクトのルート直下のMigrationsフォルダ以下に作成されます。通常は、マイグレーションファイルの中身を編集する必要はないですが、中身を軽く見ておくことにしましょう。
…略…
public partial class InitialCreate : Migration (1)
{
protected override void Up(MigrationBuilder migrationBuilder) (2)
{
migrationBuilder.CreateTable( (3)
name: "Footmark",
columns: table => new
{
ID = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
YourName = table.Column<string>(type: "TEXT", nullable: false),
Message = table.Column<string>(type: "TEXT", nullable: false),
VisitTime = table.Column<DateTime>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Footmark", x => x.ID);
});
}
protected override void Down(MigrationBuilder migrationBuilder) (4)
{
migrationBuilder.DropTable( (5)
name: "Footmark");
}
}
見ての通り、マイグレーションファイルとはクラスファイルです。クラスは、Migrationクラスを継承した、dotnet ef migrationsコマンドの引数で指定される名前になります(1)。クラスには、メソッドが2個あります。(2)のUpメソッド、(4)のDownメソッドです。それぞれ、マイグレーションを実行するとき、マイグレーションを取り消す(ロールバックする)ときに実行されます。実行では(3)のCreateTableでテーブル作成、取消では(5)のDropTableでテーブル削除が行われます。
すなわちマイグレーションとは、マイグレーションファイルに書かれたUpメソッド、Downメソッドを実行することと言えます。実際に行わせたいことは、それぞれのメソッドの中に書いておけばいいわけです。
dotnet ef database updateコマンドは、マイグレーションファイルをもとにテーブルの作成・更新・削除を実行します。
これらのコマンドを実行したあとにプロジェクトのルートフォルダを見ると、RazorPagesFootmarkContext-7671a142-….dbといったSQLiteのデータベースファイルが作成されていることがわかります。
アプリケーションの実行
データベースが作成されたので、今度こそアプリケーションが実行できるようになりました。作成・変更されたファイルの中身を見るのは次回にして、まずはアプリケーションを実行してみます。[Ctrl]+[F5]で実行しますが、このままだと第2回で作成したサンプルアプリケーションのトップ画面が表示されるだけです。今回はモデルを追加してScaffoldingを行ったので、モデルとアクションに基づくURL(https://localhost:7040/Footmarks/Index)を再指定してページを開き直します。図4のような一覧画面になればこれまでの作業は成功です。
図4:足あとアプリの一覧画面
当然のことながら、まだ足あとはありませんので、[Create New]リンクをクリックして足あとを登録しましょう。ページがhttps://localhost:7040/Footmarks/Createに移動するので、名前とメッセージ、現在日時を入力して[Create]をクリックすると、一覧画面に戻ります。入力した足あとが表示されていることを確認してください。足あとの右に表示されている[Edit][Detail][Delete]のリンクをクリックして、いろいろと操作してみてください。
図5:足あとの新規入力画面
図6:新規入力が範囲された一覧画面
これまでの作業で、CRUDページを持った足あとアプリができあがりました。特にウィザードなどを使わなくても、コマンド操作と少しのファイル作成でこれだけのことができるのは素晴らしいですね。
まとめ
今回は、ページ指向のフレームワークであるRazor Pagesのアプリケーションにモデルを追加し、ScaffoldingによってCRUDページを作成して実際に動作させてみました。シンプルな手順でRazor Pagesアプリケーションの基本機能を作成できることを理解していただけたのではないかと思います。次回は、Razor Pagesの締めくくりとして、作成されたファイルの解説とカスタマイズを行っていきます。
