どうも~、小とろです。
お勉強用のブログ更新です。
今回はBlazorというC#版SPAフレームワークのDBアクセスサンプルになります。
動作環境
- 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
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情報を取得できます。