なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

.NET Core 3.1で作ったWPFアプリでPostgreSQLへEntityFrameworkを使ってアクセスしてみる

WinFormsではEntityFramwworkを使ってPostgreSQLへアクセスした実績はありますが、WPFましてや.NET Coreでは初めてなのできちんと動作できるか検証してみます。

まずはNuGetで「Npgsql.EntityFrameworkCore.PostgreSQL」をインストールします。

あと、何かと便利な「ReactiveProperty」も使ってます。

データベースで管理するデータは

ID 名前 年齢
serial text integer

とし、IDはPostgreSQL側で自動的に割り当てるようにします。

IDは必要なのか?といった疑問があるかもしれませんが、EntityFrameworkではプライマリキー(key属性のデータ)は必ず必要です。

今回は「アクセスする手法」が目的なのでデータベーステーブルはSQLコマンドで作ります。

CREATE TABLE memberlist(id serial, name text, age integer);
usingの追加
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
プログラム内でデータベースのデータをアレコレするクラス
[Table("memberlist")]
public class MenberList
{
    [Key]
    [Column("id")]
    public long Id { get; set; }

    [Required]
    [Column("name")]
    public string Number { get; set; }

    [Required]
    [Column("age")]
    public int Age { get; set; }
}

[Table("memberlist")]:データベースのテーブル名を示します。

[Key]:プライマリーキーを示します。

[Column("xxx")]:データベース上のカラム名を示します。

[Required]:入力が必須である事を示します。

「public long Id」や「public string Number」はプログラム内で使う変数です。

実際データベースにアクセスするにはDbContextを継承したインスタンスを用いて行います。

DbContextを継承したクラス
public class Db : DbContext
{
    public DbSet Menber { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Host=localhost; Port=5432; Username=postgres; Password=pass; Database=postgres; SearchPath=public");
    }
}

「UseNpgsql」にセットする文字は自分の環境にあった内容に変更してください。

自分が確認した中では「Port」の記述がなくても動いてます。


データベースへ書き込みする手段
using var db = new Db();
var newMenber = new MenberList { Name = AddName.Value, Age = int.Parse(AddAge.Value) };
db.Menber.Add(newMenber);
db.SaveChanges();

1.クラス「Db」のインスタンスを生成する。

2.追加する「MenberList」クラスのインスタンスを生成して値をセットする。

3.DbクラスのインスタンスdbへAddする。

4.SaveChangesで保存する。

の順番で処理しています。

SQLコマンドのINSERTするのと同じですが、そう難しい処理ではありません。

(でもLINQのスキルは必須ですよ)


削除する方法
using var db = new Db();
var deleteMember = db.Menber.First(m => m.Name == DeleteName.Value);
db.Menber.Remove(deleteMember);
db.SaveChanges();

1.クラス「Db」のインスタンスを生成する。

2.削除するデータを抽出する。

3.DbクラスのインスタンスdbからRemoveする。

4.SaveChangesで保存する。

この動作はSQLコマンドのDELETEに該当します。

2の削除対象を抽出する手段はこれだけではないので分からない人はLINQを勉強しましょう。

無論SQLコマンドのUPDATEと同じ事も可能です。

あと、遅延評価だという事は忘れずにね。


サンプルはあくまで「アクセスできるか」だけに特化しているので、未入力チェックなどはしていませんので随時適切な処理が必要です。