You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Entity Framework Core中使用Oracle内置函数?

EF Core映射Oracle内置函数的解决方案

你遇到的ORA-00904错误,是因为EF Core默认会给注册的数据库函数加上当前数据架构前缀(比如你的"MySchema.LENGTHB"),但Oracle的内置函数是全局可用的,不需要架构前缀,所以Oracle识别不了带架构的函数名。

解决步骤如下:

  1. 修正DbFunction注册代码
    在注册函数时,添加.HasSchema(null)来移除架构前缀,告诉EF Core这是全局内置函数:
modelBuilder.HasDbFunction(typeof(OracleFunctions).GetMethod(nameof(OracleFunctions.LENGTHB)))
            .HasName("LENGTHB")
            .HasSchema(null); // 关键:移除架构前缀

modelBuilder.HasDbFunction(typeof(OracleFunctions).GetMethod(nameof(OracleFunctions.ToChar)))
            .HasName("TO_CHAR")
            .HasSchema(null);
  1. 确保静态方法的参数/返回值匹配
    检查你的静态方法签名,要和Oracle函数的行为匹配:
  • LENGTHB针对字节数组返回整数,你的方法没问题;
  • TO_CHAR处理可空decimal,返回字符串,建议把返回值改成可空字符串(string?)更贴合Oracle的行为(如果输入为null,函数返回null):
public static class OracleFunctions
{
    public static int LENGTHB(this byte[] input)
    {
        throw new NotSupportedException("此函数仅可用于LINQ to Entities查询。");
    }

    public static string? ToChar(this decimal? value)
    {
        throw new NotSupportedException("此函数仅可用于LINQ to Entities查询。");
    }        
}
  1. 验证查询使用
    你的查询代码不需要修改,运行后EF Core会生成不带架构前缀的SQL,比如:
SELECT ... WHERE LENGTHB("Template") > 0

这样Oracle就能正确识别内置函数了。

内容的提问来源于stack exchange,提问作者sstr27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:52:04