SHOW Toro TIME

ゲームや技術的なこと、最近の気になることをどんどん書いていくブログです

Blazor + Entitiy Frameworkを使ったDBアクセス

どうも~、小とろです。

お勉強用のブログ更新です。

今回はBlazorというC#版SPAフレームワークのDBアクセスサンプルになります。

f:id:shotoro:20200723002027p:plain:w800

動作環境

  • Blazor(.Net Core 3.1.301)
    • サーバサイド
  • Entitiy Framework(NuGetパッケージ)
  • Vistual Studio 2019
  • SQLServer 2017

前提

  • 動作環境の設定は完了していることとします。

ローカルのSQL Serverへの接続方法

  • BlazorとEntitiy Frameworkを使ってローカルのSQL Serverへの接続する方法を記載します。

  • ローカルのSQL Serverに以下の内容でDBがあるとします。

  ・サーバ名:localhost\MYSQLEXPRESS
  ・DB名:mydb
  ・テーブル名:dbo.users
    ・列1:id
    ・列2:name
    ・列3:gender
    ・列4:age

f:id:shotoro:20200624151424p:plain:w400

DB接続設定

  • Blazorプロジェクト内のappsettings.jsonにDB接続文字列記述します。

  • DB接続文字列はConnectionStringsの項目部分

  {
    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "AllowedHosts": "*",
    "ConnectionStrings": {
      "LocalDatabase": "Data Source=localhost\MYSQLEXPRESS;Initial Catalog=mydb;Persist Security Info=True;User ID=<DBユーザ名>;Password=<DBパスワード>"
    }
  }

  • 続いてBlazorプロジェクト内のStartup.csにConnectionStringsの内容を設定し、接続先を定義します。

  • 定義はConfigureServicesメソッド内に定義します。

・・・
          public void ConfigureServices(IServiceCollection services)
          {
              services.AddDbContext<AppDbContext>(options =>
                  options.UseSqlServer(
                      Configuration.GetConnectionString("LocalDatabase"),
                      providerOptions => providerOptions.CommandTimeout(120)));
          }
・・・

DB参照系の実装

  • 必要なプログラムは3種類

    • DbContextクラス:EntityFrameworkの処理にてアプリケーションとデータベースのやり取りを担います
    • Modelクラス:アプリケーションやデータベースで取り扱われるデータ定義です
    • Serviceクラス:DbContextクラスを利用し、実施にデータベースへSQL文を発行する処理を実行します
  • 今回は例として、プログラムはBlazorプロジェクトのDataフォルダ配下に置きます

    • クラスの数が多くなる場合はフォルダ分けを行うと良さそうです

①DbContextクラス

  • クラス名はAppDbContextとして、DbContextを継承したクラスとなります
  • ファイル名:AppDbContext.cs

using Microsoft.EntityFrameworkCore;
namespace BlazorServerApp.Data
{
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        {
        }
     public virtual DbSet<User> Users { get; set; }
    }
}

② Modelクラス

  • 今回はUser情報を持ったModelクラスとします
  • ファイル名:User.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace BlazorServerApp.Data { public class User { public int Id { get; set; } public string Name { get; set; } public string Gender { get; set; } public int Age { get; set; } } }

③Serviceクラス

  • 今回はユーザ情報を取得するサービスとしてUserDataServiceを作成します
  • ファイル名:UserDataService.cs

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace BlazorServerApp.Data { public class UserDataService { private AppDbContext DbContext;      public UserDataService(AppDbContext dbContext) { DbContext = dbContext; }      public async Task<IEnumerable<User>> GetUsersAsync(CancellationToken ct = default) { return await DbContext.Users.FromSqlRaw($"SELECT * FROM dbo.users").ToListAsync(); } } }

  • これでサービスクラスのGetUsersAsyncメソッドを呼び出せばUser情報を取得できます。

参考リンク