データベースにMySQLを使ってASP.NET CoreでWeb APIを作成する

公式サイトのチュートリアルをMySQLで実現してみたのでその記録

検証環境

  • OS: Windows 10
  • IDE: Visual Studio 2019

MySQLはDocker Composeで起動

docker-compose.yml を作成し、以下の内容を記載する。
(今回は検証なのでパスワードは一律で password にしておく)

version: '3'
services:
    db:
        image: mariadb:10
        command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
        environment:
            MYSQL_DATABASE: todoapi
            MYSQL_USER: todoapi
            MYSQL_PASSWORD: password
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"

以下のコマンドを実行し、MySQLサービスを起動しておく。

docker-compose up -d

以下のコマンドで起動しているか確認できる。

> docker-compose ps   
    Name                  Command               State           Ports
------------------------------------------------------------------------------
todoapi_db_1   docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp

Webプロジェクトの作成

ここは公式サイト通り

  • [ファイル] -> [新規作成] -> [プロジェクト]
  • テンプレートの中から [ASP.NET Core Webアプリケーション] を選択して [次へ] をクリック
  • プロジェクト名に TodoApi と入力して [作成] をクリック
  • [新しいASP.NET Core Webアプリケーションの作成] ダイアログで [.NET Core][ASP.NET Core 3.1] が選択されていることを確認
  • [API] テンプレートを選択して [作成] をクリック

モデルクラスの追加

ここも公式サイト通り

  • プロジェクト直下に Models フォルダを作成
  • Models フォルダ直下に TodoItem クラスを作成
  • TodoItem クラスに以下のコードを追加
public class TodoItem
{
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}

データベースコンテキストの追加

公式サイトではSQLServerをインストールするが、今回はMySQLをインストールする。

  • [ツール] -> [NuGetパッケージマネージャー] -> [ソリューションのNuGetパッケージの管理]
  • [参照] タブを選択し、検索ボックスに Pomelo.EntityFrameworkCore.MySql と入力
  • 左側のウィンドウで [Pomelo.EntityFrameworkCore.MySql] を選択
  • 右側のウィンドウで [プロジェクト] チェックボックスをオンにして [インストール] をクリック

TodoContextデータベースコンテキストの追加

ここは公式サイト通り

  • Models フォルダ直下に TodoContext クラスを作成
  • TodoContext クラスに以下のコードを追加
using Microsoft.EntityFrameworkCore;

namespace TodoApi.Models
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<TodoItem> TodoItems { get; set; }
    }
}

データベースコンテキストの登録

データベース接続情報を記載するため、公式サイトとは異なる設定をする。

  • appsettings.json を編集して以下を追加
  "ConnectionStrings": {
    "MySQL": "Server=127.0.0.1;Database=todoapi;User=todoapi;Password=password;"
  }
  • Startup.cs を編集して以下を追加
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

(中略)

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TodoContext>(opt =>
                opt.UseMySql(Configuration.GetConnectionString("MySQL")));
            services.AddControllers();
        }

コントローラーのスキャフォールディング

公式サイト通り

  • Controllers フォルダを右クリック
  • [追加] -> [新規スキャフォールディングアイテム]
  • [Entity Frameworkを使用したアクションがあるAPIコントローラー] を選択して [追加] をクリック
  • [Entity Frameworkを使用したアクションがあるAPIコントローラーの追加] ダイアログで以下を選択
    • モデルクラスで [TodoItem (TodoApi.Models)] を選択
    • データコンテキストクラスで [TodoContext (TodoApi.Models)] を選択
  • [追加] をクリック

PostTodoItem作成メソッドの確認

公式サイト通り

  • TodoItemsController.csPostTodoItem メソッドの return文を以下のように変更
return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);

データベースのマイグレーション

ここは公式サイトにはない手順。
マイグレーションはコマンドラインから行う。
Visual Studioのプロジェクトを作成したフォルダで以下のコマンドを実行する。

dotnet ef migrations add DbInit
dotnet ef database update

(参考) dotnet-ef サブコマンドがインストールされていなければ以下のコマンドでインストールする

dotnet tool install --global dotnet-ef

POSTメソッドの確認

公式サイトと同じようにPostmanを使って確認する。

GETメソッドの確認

公式サイトと同じようにPostmanを使って確認する。

データベースを直接確認する

以下のコマンドでデータが作成されていることを確認する。

> docker exec -t todoapi_db_1 mysql -u todoapi -ppassword todoapi -e "SELECT * FROM TodoItems;"
+----+----------+------------+
| Id | Name     | IsComplete |
+----+----------+------------+
|  1 | walk dog |          1 |
+----+----------+------------+

今回はここまで