【C#】Entity Framework Coreを使ってPostgreSQLを操作する

C#

Entity Framework Core (EF Core) を使ってPostgreSQLを操作する方法について紹介します。

(参考)EF Coreを使わずにデータを取得する方法についてはこちら

スポンサーリンク

環境

  • Windows10
  • Visual Studio Community 2022
  • .NET 6
  • PostgreSQL 13.2

事前準備

事前にpgAdminやpsqlなどを使ってデータベースを作成しておきましょう。
今回はNpgsqlの公式ドキュメントに合わせて「my_db」にします。

create database my_db;

テーブルはEF Coreのコードファーストの手法で作成するので、特に用意する必要はありません。

プロジェクトの作成

Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリを使って説明します。

プロジェクト名は「PostgreApp」にしました。フレームワークには.NET 6.0を選択しています。

Entity Framework Core パッケージのインストール

EF CoreでPostgreSQLに接続するために、まずは「Npgsql.EntityFrameworkCore.PostgreSQL」というパッケージをインストールします。

プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックしてください。

「参照」タブで「Npgsql.EntityFrameworkCore.PostgreSQL」と検索し、出てきたパッケージをインストールします。

エンティティとコンテキストクラスの用意

無事にインストールが完了したら、テーブルに対応するエンティティクラスと、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パッケージマネージャー」→「パッケージマネージャーコンソール」でコンソールを開き、以下のコマンドを実行してみましょう。

Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database

これらのコマンドで行われることは次の通りです。

  1. マイグレーションに必要なパッケージをインストール
  2. Add-Migrationコマンドで変更内容が記録されたマイグレーションファイルを作成
  3. 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とSQLite" });
                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で実行すると、コンソール上に登録・更新内容が表示されます。

色々内容を書き換えて試してみてください。

今回はコードからテーブルを作成する「コードファースト」という手法で説明しましたが、反対に既存のテーブルをもとにコードを作成する「リバースエンジニアリング」(またはデータベースファースト)という方法もあります。

気になる方は下記ドキュメントを参照してください。

リバース エンジニアリング - EF Core
Entity Framework Core を使用した既存のデータベースからのモデルのリバース エンジニアリング

【参考書籍】

著:出井 秀行
¥3,428 (2022/09/27 13:51時点 | Amazon調べ)

コメント

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