概要
BlazorServerでPostgreSQLを使用する方法をメモがてら記載します。
この記事のターゲット
既存のデータベースを使うよ!な方(DBファースト)
データベースがPostgreSQLだよ!な方
EntityFlameWork Coreで操作するよ!な方
環境
・Visual Studio 2022
・Blazor Server
・.Net6
プロジェクトを作成する!
Visual Studio 2022を立ち上げて新しいプロジェクトの作成(N)
を選択
Blazor Server アプリ
を選択
プロジェクト名と保存場所を指定して次へ
フレームワークと認証の種類を指定して作成
(今回は.Net6.0に認証なし)
プロジェクトできた!!
PostgreSQLへの接続設定を追加する
PostgreSQLへの接続文字列を指定します。
ソリューションエクスプローラーのappsettings.Development.json
を開きます。
便利ポイント
appsettings.jsonに記載した接続文字列はリリース時(発行ビルド)に参照されます。
appsettings.Development.jsonに記載した接続文字列はデバック時に参照されます。
つまり、テスト用のデータベースと本番(運用)用データベースがある場合に接続文字列を書く場所を変えることで勝手に接続するデータベースを変えてくれるってわけだ!いやー便利便利
開いたときの初期データがこれ
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
ここにこんな感じで接続文字列を追加する
{
"ConnectionStrings": {
"db": "Server=192.168.0.999;Port=5432;Database=dbname;User Id=user;Password=user;Pooling=true;"
},
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
スキーマを指定する方法
スキーマを指定するには接続文字列に"SearchPath=スキーマ名;"を追加します。
つまりスキーマを指定する場合はこんな感じの接続文字列にします。
{
"ConnectionStrings": {
"db": "Server=192.168.0.999;Port=5432;Database=dbname;User Id=user;Password=user;Pooling=true;SearchPath=selectschema;"
},
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
これでデータベースへの接続設定は完了!
サービスを追加する
さて、こっからが一番ややこしいです。
まず、Program.csを開きます。
そしたらサービスにDBFactoryを追加します。
builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("db")));
コンパイルエラーがでちゃうのでNuGet(ニューゲットって読むらしい)から必要なライブラリを追加します。
まず、ツールバー→プロジェクト→NuGetパッケージの管理を開く
参照→EFCoreで検索→Microsoft.EntityFrameWorkCoreを選択→インストールを押下する
次に、参照→NPGSQLで検索→Npgsql.EntityFrameworkCore.PostgreSQLを選択→インストールを押下する
バージョンについて
多分ですがバージョンの6.01の6は.Net6の6を指しています。.Net5を使っている人は6.xxのバージョンをインストールしようとするとエラーがでるんじゃないでしょうか?.Net5の人は5.xxのバージョンをインストールするといいかも。
Program.csのUsingステートメントにMicrosoft.EntityFrameworkCoreを追加します。
using Microsoft.EntityFrameworkCore;
これでサービスの追加はOK!!
DBテーブルの実態クラスを作る
DBテーブルの実態クラスを作っていきます。
まず、クラスを追加します。
今回はDataフォルダに追加します。
Dataフォルダを右クリック→追加→クラス...を選択
クラスに名前をつけて追加します。
追加した瞬間のソースはこんな感じ
はじめから出来てるクラスはいらないので消しちゃいます。
そしたらそこにDBのテーブル定義クラスを作成します。
下記の画像でいうと列Idと列Userを持つt_userテーブルです。
Id列が主キーだとするとこんな感じで主キー設定ができます。
using System.ComponentModel.DataAnnotations;
namespace PostgreSQLを使いたいなー.Data
{
public class t_user
{
[Key]
public int Id { get; set; }
public string User { get; set; } = "";
}
}
これでDBテーブルの実態作成完了!!
Contextクラスを作成する
感覚としてはスキーマの実態だと思います。違ったらスマソ。
まず、クラスを追加します。
今回はDataフォルダに追加します。
Dataフォルダを右クリック→追加→クラス...を選択
クラスに名前をつけて追加します。
クラス名はApplicationDbContextとしています。
クラスできた
DBContextを継承してContextクラスを作成します。
まあ、下のソースをコピペでイケルと思います。(namespaceは要変更)
using Microsoft.EntityFrameworkCore;
namespace PostgreSQLを使いたいなー.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options){ }
}
}
public DbSet<t_user> t_user { get; set; }
これでContextの作成完了!!
使い方
使いたいページにDBFactoryをInject(オブジェクトの注入)します。
今回はIndex.razorから使います。
@page "/"
@using Data
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<ApplicationDbContext> DBFactory
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
@page "/"
@using Data
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<ApplicationDbContext> DBFactory
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
@code{
private void GetUserData()
{
using (var dbFactory = DBFactory.CreateDbContext())
{
//DBのt_userテーブルのデータをすべて取得する。
dbFactory.t_user.ToList();
}
}
}
もし、条件を指定してデータを取得した場合はこんな感じ?
@page "/"
@using Data
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<ApplicationDbContext> DBFactory
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
@code{
private void GetUserData()
{
using (var dbFactory = DBFactory.CreateDbContext())
{
//DBのt_userテーブルのデータからIdが10以下のものをすべて取得する。
dbFactory.t_user.Where(x => x.Id <= 10).ToList();
}
}
}
条件とかテーブルの結合とかはEFCoreの使い方の話になってくるので今回はここまでです。
お疲れさまでした!!