Entity Framework CoreのコードファーストでPostgreSQLに作成するテーブル名をスネークケースにしたい

EntityFramework Core(EF Core)を使ってコードファーストでデータベースに対してマイグレーションを実行するとデフォルトの設定ではテーブル名とカラム名はキャメルケースでテーブルが作成されます(テーブル名は複数形に変換される)。

例えば ProductStock というEntityであればマイグレーションを実行すると ProductStocks というテーブルが作成されます。これはデータベースがPostgreSQLの場合すこしだけ管理が面倒に感じることがあります。PostgreSQLではSQLを実行する際にテーブルやカラム名に大文字が含まれている場合、自動で小文字に変換されるという仕様になっているため大文字が含まれる名称をそのまま扱いたい場合は次のようにテーブル名やカラム名をダブルクォーテーションで括る必要があります。

SELECT "Id", "Name" FROM  "ProductStocks"

まあ括ればいいじゃん?という話しではありますが、保守等でEF Coreを使わずに直接SQLを書く機会が多いと不便に感じることも多いので、今回はキャメルケースではなくスネークケースでテーブルを作成する方法についてです。

次の2つの方法を説明します

  • 各項目に属性で設定
  • EFCore.NamingConventionsパッケージで設定

後者のパッケージを使うパターンの方が楽だと思うので、公式パッケージしか使わない等の制限がなければこちらがおすすめです。

属性で設定

追加パッケージなしで実現できるテーブルと各項目にそれぞれ指定する方法。

learn.microsoft.com

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MyApp.Core.Entities;

[Table("product_stocks")]
public class ProductStock 
{
    [Key]
    [Column("id")]
    public long Id { get; set; }

    [Column("product_name")]
    public string ProductName  { get; set; }
}

EFCore.NamingConventionsパッケージで設定

公式ではありませんがEFCore.NamingConventionsというパッケージを使うパターンだと自力で各項目に設定しなくてもいい感じにスネークケースにしてくれます(2023.11.21現在、8.0対応版はまだ正式版ではないようです)

www.nuget.org

プロジェクトにパッケージを追加したら、Program.cs.UseSnakeCaseNamingConvention(); を追加する(ASP .NET または GenericHostの場合)。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseNpgsql(...)
        .UseSnakeCaseNamingConvention();