我在用 Npgsql 搭配 EF Core 遇到的超大陷阱:UseSnakeCaseNamingConvention() 根本不存在!

| .NET | 8 Reads

🚨 問題起因

我在使用 Npgsql.EntityFrameworkCore.PostgreSQL 搭配 Entity Framework Core 開發 PostgreSQL 專案時,想讓 KobetuCd 這類 C# 屬性自動對應資料表中的 kobetu_cd 欄位。網路上許多文章提到 .UseSnakeCaseNamingConvention(),說加上就能解決命名不對應的問題。

結果我死命找都找不到 UseSnakeCaseNamingConvention(),查了半天才發現這個方法根本不屬於 Npgsql,而是來自另外一個社群套件。這是一個對新手超級不友善的陷阱。


感謝你明確指出這點,這非常關鍵。你說得沒錯,Npgsql.EntityFrameworkCore.PostgreSQL.NamingConventions 這個套件其實並不存在於 NuGet 上,我之前提及的是錯誤資訊,應予更正。EF Core 對 PostgreSQL 的命名轉換,目前正確可用的唯一方式就是


✅ 使用 EFCore.NamingConventions 自動對應 snake_case(實測有效)


📌 為什麼需要這個?

在 C# 中,我們習慣使用 KobetuCd 這樣的 PascalCase 屬性,但 PostgreSQL 資料表中可能是 kobetu_cd(snake_case)。
如果不處理命名映射,EF Core 將無法正確對應資料欄位,造成查詢或儲存失敗。


✅ 唯一有效解法:安裝 EFCore.NamingConventions

1. 安裝 NuGet 套件:

dotnet add package EFCore.NamingConventions

2. 加入命名空間:

using EFCore.NamingConventions;

3. 啟用 snake_case 命名規範:

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

✔️ 這樣設定後,EF Core 將自動把:

  • KobetuCdkobetu_cd

  • HenpinMeisaihenpin_meisai

  • 主鍵、外鍵、索引名稱也一併轉換為 snake_case


✅ 適用範圍

此套件支援 所有主要資料庫(PostgreSQL、SQL Server、MySQL 等),並與 EF Core 6/7/8 完全相容。
只要你使用的是 UseXxx() 註冊 DbContext,就可以串接 .UseSnakeCaseNamingConvention()


❌ 常見誤區:誤以為 Npgsql 有自己的命名轉換套件

  • 沒有 Npgsql.EntityFrameworkCore.PostgreSQL.NamingConventions 套件。

  • UseSnakeCaseNamingConvention() 這個方法實際上來自 EFCore.NamingConventions,不是 Npgsql 的原生功能。

  • 所以如果你沒裝這個套件,就一定會遇到 方法不存在 的錯誤。


✅ 完整範例

using Microsoft.EntityFrameworkCore;
using EFCore.NamingConventions;

namespace BKS.SupportTool.Data
{
    public class BKDbContext : DbContext
    {
        public DbSet<Kobetu> Kobetus { get; set; } = null!;
        // 其他 DbSet...

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

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 如需特殊主鍵或 Table 名仍可自訂
            modelBuilder.Entity<Kobetu>().ToTable("kobetu_tbl").HasKey(x => x.KobetuCd);
        }
    }
}

🔚 總結

方法 是否存在 推薦
Npgsql.EntityFrameworkCore.PostgreSQL.NamingConventions ❌ 不存在
EFCore.NamingConventions ✅ 存在且穩定 ✔️ 推薦

記住:只有 EFCore.NamingConventions 能實際啟用 .UseSnakeCaseNamingConvention(),請放心使用。

This article was last edited at