データベースに MySQL を利用して、Micorsoft の ASP.NET Core MVC のチュートリアル「ASP.NET Core MVC の概要」および「パート 4、ASP.NET Core MVC アプリにモデルを追加する」に従ってアプリを作る方法を書きます。
チュートリアルは、モデル(エンティティ)クラスの定義だけをプロジェクトに追加し、その後 CRUD 操作に必要な Controller、View などのコードやデータベースを Visual Studio 2019 のデザイナを利用して自動生成するというものです。初心者でも簡単に作成できるアプリながら、データベースを利用する ASP.NET Core MVC の基本的かつ重要な部分が含まれていると思います。
チュートリアルは SQL Server を使用する前提で書かれていますが、それを MySQL に変える場合はどのようにするかを以下に書きます。MySQL 本体は先の記事「MySQL をインストールしました(その 3)」に書きました既存の 8.0.19 を使います。
(1) プロジェクトの作成
チュートリアル「ASP.NET Core MVC の概要」の通り、Visual Studio 2019 のテンプレートを利用して対象のフレームワークは .NET 5.0 で認証「なし」の ASP.NET Core MVC アプリを作成します。
対象のフレームワークは .NET Core 3.1 でも良いですが、そうした場合は NuGet パッケージのバージョンの選び方に注意してください。間違うとスキャフォールディングでエラーになります。
また、認証を「個別のアカウント」にすると SQL Server を利用した Entity Framework 関係のパッケージがインストールされ話がややこしくなりますので、まずは認証は「なし」でやってみることをお勧めします。
(2) モデルの定義とスキャフォールディングの実行
チュートリアル「パート 4、ASP.NET Core MVC アプリにモデルを追加する」に従って、モデル(エンティティ)クラスの定義をプロジェクトに既存の Models フォルダに追加します。
using System;
using System.ComponentModel.DataAnnotations;
namespace MySqlMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}
次に、Microsoft.EntityFrameworkCore.Design を NuGet からインストールします。この記事では、この記事を書いた時点での最新版 5.0.10 を使いました。対象のフレームワークを .NET Core 3.1 にした場合は、Microsoft.EntityFrameworkCore.Design のバージョンは 3.1.18 にするのが良さそうです。5.0.10 を使うとスキャフォールディングでエラーになると思います。
チュートリアルの通り Visual Studio でスキャフォールディングを実行すると以下の操作が自動的に行われます。
-
他に必要な NuGet パッケージ(Microsoft.EntityFrameworkCore.SqlServer, Microsoft.EntityFrameworkCore.Tools, Microsoft.VisualStudio.Web.CodeGeneration.Design)の追加
-
Data フォルダにコンテキストクラスの作成
-
Startup.cs ファイルの ConfigureServices メソッドにコンテキストの登録
-
appsettings.json ファイルへの接続文字列の追加
-
CRUD 操作に必要な Controller / View 一式の生成
SQL Server の場合は上記でプロジェクトは完成ですが、MySQL を利用する場合は上の 1, 3, 4 に以下の変更を行う必要があります。
(3) NuGet パッケージの変更
スキャフォールディングで自動的に追加された NuGet パッケージ Microsoft.EntityFrameworkCore.SqlServer を削除します。 代わりに MySql.Data.EntityFrameworkCore をインストール・・・しようとしたら非推奨とのこと。 代替えパッケージが MySql.EntityFrameworkCore とのことなのでその最新版 5.0.5 をインストールしました。その結果が以下の画像です。
(スキャフォールディングで自動的に追加される Microsoft.EntiryFrameworkCore.Tools のバージョンは 5.0.9 ですが、Migration 操作の際ランタイムのバージョン 5.0.10 より古いという警告が出るので、上の画像では 5.0.10 に更新しています)
(4) Startup.cs ファイルの修正
スキャフォールディング操作で Startup.cs ファイルの ConfigureServices メソッドに自動的にコンテキストが登録されますが、それは SQL Server 用なので、以下のように UseSqlServer を UseMySQL に変更します。
コンテキストクラスの登録はコントローラーへの DI に必要です。登録してあれば、フレームワークがクライアントからの要求を受けてコントローラーを初期化する際、コンテキストクラスを初期化してコンストラクタ経由で渡してくれます。
(5) 接続文字列を MySQL 用に変更
スキャフォールディング操作で appsettings.json ファイルに接続文字列が自動生成されますが、それは SQL Server 用なので MySQL 用に変更します。
データベース名は任意です。上の画像のように database=MySqlMovie というようにデータベース名を指定すると、Entity Framework Code First の機能を使って MySqlMovie という名前のデータベースを新たに生成し、そこに必要なテーブルを生成してくれます。
(6) Add-Migration の実行
Visual Studio のパッケージマネージャーコンソールで Add-Migration InitialCreate コマンドを実行します。結果、以下の画像の通り InitialCreate クラスが Migrations フォルダに自動生成されます。
ちなみに、InitialCreate という名前は任意に指定できます。指定した名前で xxxxx_InitialCreate.cs (xxxxx は作成日時) という名前のファイルが作成され、それに InitialCreate という名前のクラスが定義されます。
(7) Update-Database の実行
Visual Studio のパッケージマネージャーコンソールで Update-Database
コマンド を実行します。これにより以下の画像の通り MySQL にデータベースが生成されます。
接続文字列で database=MySqlMovie とした通り MySqlMovie という名前でデータベースが生成され、InitialCreate クラスの name: "Movie" で指定された名のテーブルが生成されています。
(8) プロジェクトの実行
上記 (7) まででアプリは完成です。プロジェクトを実行して Create 画面を表示して 2 つレコードを追加し、Index 画面でその一覧を表示したのがこの記事の一番上の画像です。
MySQL の Movie テーブルにも追加結果が反映されています。