Entity Framework Core (EF Core) を使ってPostgreSQLを操作する方法について紹介します。
(参考)EF Coreを使わずにデータを取得する方法についてはこちらの記事を参照。
環境
- Visual Studio 2022
- .NET 6
- PostgreSQL 13.2
事前準備
事前にpgAdminやpsqlなどを使ってデータベースを作成しておきましょう。
今回は「my_db」という名のデータベースを作成します。
create database my_db;
テーブルはEF Coreのコードファーストの手法で作成するので、事前に用意する必要はありません。
プロジェクトの作成
Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリを使って解説します。

Entity Framework Core データベースプロバイダーのインストール
EF CoreでPostgreSQLに接続するために、「Npgsql.EntityFrameworkCore.PostgreSQL」というパッケージをインストールします。
プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックしてください。

「参照」タブで「Npgsql.EntityFrameworkCore.PostgreSQL」と検索し、出てきたパッケージをインストールします。
※プロジェクトを.NET 6で作成した場合は、バージョン6系をインストールするようにしてください。

また、後のマイグレーションに必要な「Microsoft.EntityFrameworkCore.Tools」も同様の手順でインストールしておきます。

エンティティとコンテキストクラスの用意
Microsoftのドキュメントを参考に、ブログ記事を管理する簡単なアプリケーションを作成します。
まずは2つのエンティティクラスと、DBとエンティティクラスの橋渡しを行うコンテキストクラスを作成しましょう。
プロジェクト名を右クリックし、「追加」→「クラス」 で、以下の3つのクラスを作成してください。

Blogエンティティを定義します。ブログID(主キー)とURL、記事の内容を保持するテーブルです。
namespace PostgreApp
{
internal class Blog
{
public int BlogId { get; set; }
public string? Url { get; set; }
public List<Post> Posts { get; } = new List<Post>();
}
}
次に、投稿内容を保持するPostテーブルのエンティティを定義します。
記事のタイトルと内容の他に、親となるブログのデータも保持します。
namespace PostgreApp
{
internal class Post
{
public int PostId { get; set; }
public string? Title { get; set; }
public string? Content { get; set; }
public int BlogId { get; set; }
public Blog? Blog { get; set; }
}
}
最後はコンテキストクラスです。
「UseNpgsql」の後にPostgreSQLの接続文字列を入力します。
using Microsoft.EntityFrameworkCore;
namespace PostgreApp
{
internal class BloggingContext : DbContext
{
public DbSet<Blog>? Blogs { get; set; }
public DbSet<Post>? Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseNpgsql("Host=localhost;Database=my_db;Username=postgres;Password=<パスワード>");
}
}
マイグレーション
マイグレーションを行うことで、作成した2つのエンティティに合わせてテーブルが作成されます。
「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」でコンソールを開き、以下のコマンドを実行してみましょう。
Add-Migration InitialCreate
Update-Database
これらのコマンドで行われることは下記の通りです。
- Add-Migrationコマンド:変更内容が記録されたマイグレーションファイルを作成
- Update-Databaseコマンド:マイグレーションファイルの内容をDBに反映
実行後、「Done」と表示されればマイグレーション成功です。
PostgreSQLを確認すると、テーブルが作成されていることが確認できます。

CRUD操作の実装
それでは、作成されたDBに対してCRUD操作を行うプログラムを実装しましょう。
namespace PostgreApp
{
internal class Program
{
private static void Main()
{
using (var db = new BloggingContext())
{
// 登録
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();
// 読み取り
var blog = db.Blogs.OrderBy(b => b.BlogId).First();
Console.WriteLine($"ブログを新規登録しました! " + $"ブログID:{blog.BlogId}, ブログURL:{blog.Url}");
// 更新
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(new Post { Title = "Hello World", Content = "EF CoreとPostgreSQL" });
db.SaveChanges();
Console.WriteLine($"ブログを更新しました! " + $"ブログID:{blog.BlogId}, ブログURL:{blog.Url}");
Console.WriteLine($"投稿タイトル:{blog.Posts.First().Title}, " + $"投稿内容:{blog.Posts.First().Content}");
// 削除
Console.WriteLine("ブログを削除しました!");
db.Remove(blog);
db.SaveChanges();
}
}
}
}
Ctrl+F5で実行すると、コンソール上に登録・更新内容が表示されます。
(上記のコードでは最後に登録したデータを削除しているため、DB上ではデータを確認できません)

色々内容を書き換えて試してみてください。
今回はコードからテーブルを作成する「コードファースト」という手法で説明しましたが、反対に既存のテーブルをもとにコードを作成する「リバースエンジニアリング」(またはデータベースファースト)という方法もあります。
気になる方は下記ドキュメントを参照してください。

【参考書籍】