4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Blazor ServerでPostgreSQLをEFCoreで操作する方法

Last updated at Posted at 2022-02-04

#概要
BlazorServerでPostgreSQLを使用する方法をメモがてら記載します。

#この記事のターゲット
既存のデータベースを使うよ!な方(DBファースト)
データベースがPostgreSQLだよ!な方
EntityFlameWork Coreで操作するよ!な方
#環境
・Visual Studio 2022
・Blazor Server
・.Net6
#プロジェクトを作成する!
Visual Studio 2022を立ち上げて新しいプロジェクトの作成(N)を選択
image.png
Blazor Server アプリを選択
image.png
プロジェクト名と保存場所を指定して次へ
image.png
フレームワークと認証の種類を指定して作成
(今回は.Net6.0に認証なし)
image.png
プロジェクトできた!!
image.png
#PostgreSQLへの接続設定を追加する
PostgreSQLへの接続文字列を指定します。
ソリューションエクスプローラーのappsettings.Development.jsonを開きます。
image.png

便利ポイント
appsettings.jsonに記載した接続文字列はリリース時(発行ビルド)に参照されます。

appsettings.Development.jsonに記載した接続文字列はデバック時に参照されます。

つまり、テスト用のデータベースと本番(運用)用データベースがある場合に接続文字列を書く場所を変えることで勝手に接続するデータベースを変えてくれるってわけだ!いやー便利便利

開いたときの初期データがこれ

appsettings.Development.json
{
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

ここにこんな感じで接続文字列を追加する

appsettings.Development.json
{
  "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=スキーマ名;"を追加します。

つまりスキーマを指定する場合はこんな感じの接続文字列にします。

appsettings.Development.json
{
  "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を開きます。
image.png
そしたらサービスにDBFactoryを追加します。
image.png

DBFactoryサービスを追加
builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("db")));

コンパイルエラーがでちゃうのでNuGet(ニューゲットって読むらしい)から必要なライブラリを追加します。
まず、ツールバー→プロジェクト→NuGetパッケージの管理を開く
image.png
参照→EFCoreで検索→Microsoft.EntityFrameWorkCoreを選択→インストールを押下する
image.png

次に、参照→NPGSQLで検索→Npgsql.EntityFrameworkCore.PostgreSQLを選択→インストールを押下する
image.png

バージョンについて
多分ですがバージョンの6.01の6は.Net6の6を指しています。.Net5を使っている人は6.xxのバージョンをインストールしようとするとエラーがでるんじゃないでしょうか?.Net5の人は5.xxのバージョンをインストールするといいかも。

Program.csのUsingステートメントにMicrosoft.EntityFrameworkCoreを追加します。
image.png

参照を追加
using Microsoft.EntityFrameworkCore;

これでサービスの追加はOK!!

#DBテーブルの実態クラスを作る

DBテーブルの実態クラスを作っていきます。
まず、クラスを追加します。
今回はDataフォルダに追加します。
Dataフォルダを右クリック→追加→クラス...を選択
image.png
クラスに名前をつけて追加します。
image.png
追加した瞬間のソースはこんな感じ
image.png
はじめから出来てるクラスはいらないので消しちゃいます。
image.png
そしたらそこにDBのテーブル定義クラスを作成します。
下記の画像でいうと列Idと列Userを持つt_userテーブルです。
image.png
Id列が主キーだとするとこんな感じで主キー設定ができます。
image.png

主キーに設定
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フォルダを右クリック→追加→クラス...を選択
image.png
クラスに名前をつけて追加します。
クラス名はApplicationDbContextとしています。
image.png
クラスできた
image.png
DBContextを継承してContextクラスを作成します。
まあ、下のソースをコピペでイケルと思います。(namespaceは要変更)

DBContextを継承
using Microsoft.EntityFrameworkCore;

namespace PostgreSQLを使いたいなー.Data
{
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
             : base(options){ }

    }
}

そしたらここにさっき作成したテーブルクラスを設定します。
image.png

DBSetを追加
public DbSet<t_user> t_user { get; set; }

これでContextの作成完了!!

#使い方
使いたいページにDBFactoryをInject(オブジェクトの注入)します。
今回はIndex.razorから使います。
image.png

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?" />

こんな感じで使えます。
image.png

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?" />

@code{
    private void GetUserData()
    {
        using (var dbFactory = DBFactory.CreateDbContext())
        {
            //DBのt_userテーブルのデータをすべて取得する。
            dbFactory.t_user.ToList();
        }
    }
}

もし、条件を指定してデータを取得した場合はこんな感じ?

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?" />

@code{
    private void GetUserData()
    {
        using (var dbFactory = DBFactory.CreateDbContext())
        {
            //DBのt_userテーブルのデータからIdが10以下のものをすべて取得する。
            dbFactory.t_user.Where(x => x.Id <= 10).ToList();
        }
    }
}

条件とかテーブルの結合とかはEFCoreの使い方の話になってくるので今回はここまでです。

お疲れさまでした!!

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?