BlazorでMySQLを使う方法

この記事にはプロモーションが含まれています。

今回はWEBアプリ版のBlazorでMySQLデータベースを使用する方法を備忘録として残します。以前の記事でご紹介したWebAssembly版のBlazorとの違いは、WebAssembly型はブラウザ上でバイトコードを実行して動作しますが、WEBアプリ版はサーバー側で必要な処理をすべて実行して処理結果のみをブラウザーに送信する仕組みの様です。このためWebAssembly版のBlazorでデータベースを使用したい場合は別途ホストするサーバーが必要になりますが、WEBアプリ版であれば直接データベースを操作できますので、単独でサーバー側とクライアント側両方の処理を作成できます。

今回の記事を作成するにあたり以下の講座で勉強させていただきました。外国人の講師の方ですがとても流暢な日本語を話されています。

Udemy

BlazorでのWebアプリケーション開発手法1【C#】

Blazorで開発を行う場合は「Visual Studio」を使用するのが一般的と思われますが、VSCodeでも開発可能なのでこの記事ではWindows版のVSCodeを使用しています。(WEBアプリ版のBlazorはWSL2でも開発(デバッグ)可能です。) 実際に試されたい方は以前の記事を参考にして「.NET SDK」をインストールして下さい。MySQLサーバーはMAMPに付属のものを使用していますが、独自にインストールしても動作すると思われます。

Blazorプロジェクトを作成して実行します

Windows版のVSCodeでBlazorアプリを作成して実行できるか確認します。

任意のアプリケーション名フォルダー(BlazorApp等)を作成してVSCodeで開きます。今回は最新のSDKを使用したいので「Ctrl + @」と入力してターミナル画面を開いて以下の様に入力して「.NET 9.0 SDK」を追加します。

winget install Microsoft.DotNet.SDK.9

WSL2(22.04以上)の場合は以下の様に入力するとインストールされます。(538MBの空き容量が必要です。)

add-apt-repository ppa:dotnet/backports
apt install dotnet-sdk-9.0

ターミナル画面に以下の文字列を入力してアプリのひな型を作成します。

dotnet new blazor -o .

「F5」キーを押してWEBアプリを実行します。デバッガーの選択リストから「C#」を選択します。

起動構成の選択リストから「C#: BlazorApp [http] BlazorApp」を選択します。

.NETアプリがビルドされて、ブラウザーで以下の様な画面が表示されたら正常に動作しています。2回目以降は「F5」キーを押すだけで起動します。

※ブラウザーを閉じても自動でデバッガーが終了しないので、お手数ですが手動でデバッガーを終了してください。

データ操作のひな型ページを作成します

まず最初にデータテーブルのひな型となるモデルを作成しておきます。Blazorは特にモデルを作成するフォルダ等は決まっていない様なので、とりあえずアプリのフォルダ内に「Models\User.cs」というファイルを作成して以下の様に記述しておきます。

using System.ComponentModel.DataAnnotations;

namespace BlazorApp.Models
{
    public class User
    {
        public int Id { get;set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
    }
}

次に「.NETツール」というツールをインストールして行きます。まずこちらのサイト様の記事を参考に、ターミナル画面に以下の様に入力してローカル環境(アプリのフォルダ内)にツールをインストールする準備をします。コマンドを実行するとアプリフォルダ内に「.config\dotnet-tools.json」というファイルが作成されます。

dotnet new tool-manifest

ターミナル画面に以下の様に入力して、ひな型作成(スキャフォールディング)ツールをインストールします。

dotnet tool install Microsoft.dotnet-scaffold

以下のコマンドを入力してスキャフォールディングを実行します。

dotnet scaffold

カテゴリーから「Blazor」を選択します。

Pick a scaffolding category: 

  API
  Aspire
> Blazor
  Identity
  MVC
  Razor Pages
  (Show All)

  Navigation
    Exit

スキャフォールディングコマンドから「Razor Components with EntityFrameworkCore」を選択します。

Pick a scaffolding command:

  Blazor Identity (dotnet-scaffold-aspnet)
  Razor Component (dotnet-scaffold-aspnet)
> Razor Components with EntityFrameworkCore (CRUD) (dotnet-scaffold-aspnet)        

  Navigation
    Back
    Exit

アプリを選択します。

.NET project file:

> BlazorApp (BlazorApp.csproj) 

  Navigation
    Back
    Exit

先ほど作成した「User」モデルを選択します。

Model Name:

> User (User)
  Program (Program) 

  Navigation        
    Back
    Exit

データコンテキスト(データベース接続用)クラスの名前を聞かれるので任意の名称(MySqlContext等)を入力します。無効な形式の名称が入力された場合は「NewDbContext」になります。

Enter a new value for 'Data Context Class' (< to go back) :  MySqlContext

プロバイダ名を聞かれますが、候補にMySQLは無いのでとりあえず「sqlserver-efcore」を選択します。

Database Provider:

  npgsql-efcore (npgsql-efcore)       
> sqlserver-efcore (sqlserver-efcore) 
  sqlite-efcore (sqlite-efcore)       
  cosmos-efcore (cosmos-efcore)       

  Navigation
    Back
    Exit

作成するページタイプを聞かれるので「CRUD」(すべてのページ)を選択します。

Page Type:

> CRUD (CRUD)
  Create (Create)
  Delete (Delete)
  Details (Details)
  Edit (Edit)
  Index (Index)

  Navigation
    Back
    Exit

プレリリースのパッケージを含めるかどうか聞かれますので、「No」を選択しておきます。

Include Prerelease packages?: 

  Yes
> No

  Navigation
    Back
    Exit

スキャフォールディングが終了すると以下のファイル群が作成されます。

BlazorApp
├─Components
│   └─Pages
│       └─UserPages
│           ├─Create.razor
│           ├─Delete.razor
│           ├─Details.razor
│           ├─Edit.razor
│           └─Index.razor
└─MySqlContext.cs

データベース接続用のクラス(MySqlContext等)は以下の様になっています。モデルを追加した場合は5行目のフォーマットにならってクラス名とインスタンス名を変更して追加します。

using Microsoft.EntityFrameworkCore;

public class MySqlContext(DbContextOptions<MySqlContext> options) : DbContext(options)
{
    public DbSet<BlazorApp.Models.User> User { get; set; } = default!;
}

このままでは作成したページが表示されないので、「Components\Layout\NavMenu.razor」というファイルを開いて以下のHTMLを28行目辺りに追加します。

        <div class="nav-item px-3">
            <NavLink class="nav-link" href="users">
                <span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Users
            </NavLink>
        </div>

「F5」キーを押して実行すると「Users」メニューが追加されていますが、まだデータベースを設定していないのでクリックするとエラーになります。

データベースを作成します

Blazorアプリが使用するMySQLデータベースを作成します。エクスプローラーを起動して、上部のパス入力欄に「C:\MAMP\bin\mysql\bin」と入力してenterキーを押します。そのまま同じ入力欄に「cmd」と入力してenterキーを押して、Windowsのコマンドプロンプトを表示させます。データベースアプリを起動するためにMAMPも起動しておきます。

表示されたウィンドウに「mysql -uroot -proot」と入力して、MySQLのコマンドプロンプトを表示させます。

C:\MAMP\bin\mysql\bin>mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

MySQLのプロンプトで、以下の様に入力してデータベースとユーザーを作成します。(データベース名やユーザー名、パスワードはご自身の環境に合わせて適宜変更してください。)

create database blazorapp;
grant all privileges on blazorapp.* to blazor@'localhost' identified by 'password'; 
exit;
データベースを設定します

ターミナル画面に以下の様に入力して「Entity Framework Core」ツールをインストールします。これはLaravelの「Eloquent」と同様のオブジェクト リレーショナル マッパー (ORM)になっています。

dotnet tool install dotnet-ef

次にMySQLのデータベースドライバー等をインストールして行きます。ターミナル画面に以下の様に入力してデータベースドライバとデータベースデザインツールをインストールします。

dotnet add package MySql.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Design

「appsettings.json」ファイルを開いて、10行目を以下の様に書き換えます。データベース名、ユーザーIDとパスワードはご自身の環境に合わせて適宜修正してください。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MySQLContext": "Server=127.0.0.1;Database=blazorapp;Uid=blazor;Pwd=password;"
  }
}

「Program.cs」というファイルを開いて、7行目にある「options.UseSqlServer」を「options.UseMySQL」に書き換えます。

using BlazorApp.Components;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("MySqlContext") ?? throw new InvalidOperationException("Connection string 'MySqlContext' not found.");

builder.Services.AddDbContextFactory<MySqlContext>(options => options.UseMySQL(connectionString));

builder.Services.AddQuickGridEntityFrameworkAdapter();

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
    app.UseMigrationsEndPoint();
}

app.UseHttpsRedirection();


app.UseAntiforgery();

app.MapStaticAssets();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();

ターミナル画面に以下の様に入力してマイグレーションファイルを作成します。

dotnet ef migrations add CreateUserTable

コマンドを実行すると「Migrations」というディレクトリと以下の様なファイルが作成されます。

Migrations
    ├─20250520060552_CreateUserTable.cs
    ├─20250520060552_CreateUserTable.Designer.cs
    └─MySqlContextModelSnapshot.cs

このままデータテーブルを作成するとエラーが出るので、ターミナル画面に以下のコマンドを入力して実行します。その後でVSCodeの左側のエクスプローラー画面にある「obj」をいうフォルダーを削除します。

dotnet clean

最後に以下のコマンドを実行するとデータテーブルが作成されます。

dotnet ef database update

データモデルが変更された場合は以下の様に新しいマイグレーションファイルを追加してからデータベースを更新する様です。

dotnet ef migrations add AdCampgroundTable
dotnet ef database update

開発時に作成履歴が必要なくてデータも消していいのであれば、以下の様にデータベースとマイグレーションファイルをすべて消して最初から作り直してもいいかもしれません。

dotnet ef database drop
dotnet ef migrations remove

dotnet ef migrations add CreateTable
dotnet ef database update

修正は以上で終了です。「F5」キーを押して実行して「Users」をクリックするとUsersページが表示されます。

登録も問題ない様ですが、モデルに[DataType(DataType.Password)]等の属性はない様なので、HTML(razor)ページの「InputText」タグに「type="password"」等の属性を追加する必要があるかもしれません。

※接続設定を変更しているため、新しいモデルを追加してもう一度スキャフォールディングを行うとエラーが発生する様です。追加したモデルの登録ページ等は自分でコピーして作成するしかなさそうです。(マイグレーションコマンド「dotnet ef migrations add ...」は問題ない様です。)

Razorページの中でデータベース接続を使用するには

スキャフォールディングで自動生成されたファイルを見ると使い方が分かる様です。大体以下の様な構成になっています。

// injectディレクティブで依存機能を注入します。
@inject IDbContextFactory<MySqlContext> DbFactory
@using BlazorApp.Models

// codeディレクティブ内でDbContextを作成して保存等の処理を行っている様です。
@code {
    [SupplyParameterFromForm]
    private User User { get; set; } = new();

    private async Task AddUser()
    {
        using var context = DbFactory.CreateDbContext();
        context.User.Add(User);
        await context.SaveChangesAsync();
        NavigationManager.NavigateTo("/users");
    }
}

今回はデータベースの操作方法を知るために、スキャフォールディングという機能で操作ページを作成しましたが、これらのページが必要ない場合は以下の手順を手動で行えばMySQLも使用できるようです。

  • 「Entity Framework Core」ツールをインストール
  • データベースドライバー等をインストール
  • 「appsettings.json」ファイルに接続文字列を追加
  • 「Program.cs」ファイルにDbContext情報を追加
  • マイグレーションの実行とデータベース更新(スキャフォールディングでも必要)

モデルを1つ作成して、自動でひな型を作ってもらった方が少し楽かもしれません。

以上です。よろしかったらお試しください。

Go

前の記事

Go言語のデバッグ