我在用 Npgsql 搭配 EF Core 遇到的超大陷阱:UseSnakeCaseNamingConvention() 根本不存在!
Copyright Notice: This article is an original work licensed under the CC 4.0 BY-NC-ND license.
If you wish to repost this article, please include the original source link and this copyright notice.
Source link: https://v2know.com/article/1147
🚨 問題起因
我在使用 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 將自動把:
KobetuCd
→kobetu_cd
HenpinMeisai
→henpin_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