スポンサーリンク

Blazor Serverから PostgreSQLへSQL文を発行する

.NET CoreBlazor Server 6.0C#PostgreSQLVisual Studio 2022

.Net 6 の Blazor Serverから、Dapper+Npgsql NuGetパッケージを使い、PostgreSQLデータベースへSQL文を発行するサンプルを作成しました。
ソースコードはGitHubで公開しています。

Blazor Serverに PostgreSQLを対象としたDB処理を実装する場合、Npgsql.EntityFrameworkCore.PostgreSQLを使ったコードファーストの実装は避けた方が良い。
Npgsql.EntityFrameworkCore.PostgreSQLは最新版でも、コードファーストの新しい書き方に対応していないことがあり、実装、試験していてもバグに気付かないことがある。

Containsを6つ使うコードファーストを実装したら、発行されたSQLにContains条件が発行されたのは4つしかないとか、SQLのIN条件に変換されていない、といったことがありました。
Containsが機能しないのは、Npgsql.EntityFrameworkCore.PostgreSQL 3.1 に含まれるバグらしい。

厄介なのは、実行されたSQLを常に確認しないと、Npgsql.EntityFrameworkCore.PostgreSQLのバグに気付けず、コードファーストで実装している人はコードファーストから発行されたSQLを確認しない点。

データ量増加に伴うSQLチューニングも、コードファーストでは対応できず、Dapper+Npgsql を使った、今回の実装方式でデータベース処理を実装し直すこともよく起こる。
「SQLを書けないからコードファーストで行く」と、PMが判断したプロジェクトで、上手く行っている現場は見たことがない。

ソースコード構成

今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .Net 6 + Blazor Server アプリ の HTTPS無し。

テンプレートに対して、PostgreSQLへSQL文を発行する、下記の処理を加えました。

ソースコード変更内容を解説

/BlazorApp1.csproj

Dapper/Npgsql NuGetパッケージをインストール。

/appsettings.Development.json

PostgreSQLへ接続するコネクションストリングを追加。

/Shared/SharedData.cs

・staticメンバ変数で実装した、アプリ全体で使えるコネクションストリング変数を追加。

/Program.cs

・アプリ起動時に環境設定ファイルを読み込み、アプリ全体で使えるコネクションストリング変数にセットする処理を追加。
 環境設定ファイルの読み込み処理をアプリ起動時1回だけにし、アプリ起動後は staticメンバ変数を直接参照することで、処理コストを減らせる。

/Model/ContractModel.cs

・PostgreSQLから取得したデータに対応する、データモデルクラスを追加。

/Pages/Counter.razor

・PostgreSQLデータベースに対して、Select文を発行する「Select from PostgreSQL」ボタンを追加。

/SQL/Contract.cs

・Select文の Where条件をメソッドパラメータから受け取り、パラメータを匿名クラスにし、DapperにSQLとパラメータを渡して、Select結果を受け取るメソッドを追加。
・データベースとC#側のデータ型が一致していれば、Any文の条件も簡単な記述で良く、あとは Dapperがバインドしてくれる。
・SQL文は定数化しておくことで処理コストを減らせる。

/_Imports.razor

・追加した classを、各Razorページで使用できるように Usingを追加。

Select対象のDBテーブル構成

コメント

タイトルとURLをコピーしました