如何解決 Oracle ORA-00904: “FALSE” 無效的 ID 錯誤?完整解析與三種實戰方案
前言 在使用 .NET 與 Entity Framework Core 連接 Oracle 資料庫時,常會遇到一個看似莫名其妙的錯誤訊息: OracleException: ORA-00904: "FALSE": 無效的 ID 如果你不是資料庫專家,看到這裡可能會疑惑:「為什麼寫程式時只是用到 C# 裡的 false ,居然跑到 SQL 裡變成了 FALSE ,而 Oracle 不認得?」本篇文章將深入淺出,帶你了解其成因,並提供三種可行的解決方案,讓你快速排除故障、恢復正常開發流程。 為什麼會發生 ORA-00904: “FALSE” 無效的 ID? Oracle 不支援 Boolean 在 Oracle 的 SQL 語言裡,並沒有像 TRUE 、 FALSE 這樣的布林(Boolean)字面量。 EF Core Provider 自動翻譯 當你在 LINQ 查詢或投影中使用了 C# 的布林值(例如 p => p.APS_DEAL ? "Y" : "N" 或直接把 bool 欄位投影),Oracle 的 EF Core 外掛在產生 SQL 時,會把 false / true 翻譯成 FALSE / TRUE ,這就觸發了「無效的 ID」錯誤。 解法一:在記憶體端處理投影(Pull then Project) 概念 :先把純資料實體取回(不帶任何方法呼叫),再用 LINQ-to-Objects 做 ToString() 、三元運算、bool→字串、格式化等邏輯。 // 1) 把實體一次查回 var plans = await _context.APSZPLANs .Where(p => p.APS_VERSION == apsVersion) .ToListAsync(); // 2) 在 C# 記憶體端再投影 var result = plans.Select(p => new APSZRESULTA { APS_PLAN_NO = p.APS_PLAN_NO, // 把布林轉成字串 APS_DEAL = p.APS_DEAL ? "Y" : "N",...