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

EF Core 7映射PostgreSQL带可空参数表值函数遇迁移错误求助

问题原因与解决方法

这个错误的核心是EF Core在生成迁移代码时,无法正确解析表值函数可选参数的空值配置,导致依赖的NullabilityInfoContext类型无法被PostgreSQL提供器处理。本质是你没有显式告诉EF Core:哪些参数对应数据库里的可选参数(带默认值),以及它们的默认值是什么。

具体修复步骤:

  1. 给C#函数的可选参数添加默认值
    你的C#函数定义里,可选参数没有显式设置默认值,虽然数据库里是默认null,但EF Core需要C#端的默认值来匹配,修改后的函数定义如下:

    public IQueryable<MyEntity> GetMyEntitiesList(Guid a, string b, int c, int? d = null, bool? e = null, Guid? f = null)
        => FromExpression(() => GetMyEntitiesList(a, b, c, d, e, f));
    
  2. 完善DbFunction的参数配置
    在OnModelCreating中,需要显式为每个可选参数指定数据库默认值,让EF Core无需通过反射推断空值信息。修改后的配置如下:

    var getMyEntitiesMethod = typeof(MyContext).GetMethod(nameof(GetMyEntitiesList),
        new[] { typeof(Guid), typeof(string), typeof(int), typeof(int?), typeof(bool?), typeof(Guid?) });
    
    modelBuilder.HasDbFunction(getMyEntitiesMethod)
        .HasName("GetMyEntitiesList") // 必须与PostgreSQL数据库中的函数名完全一致
        .HasParameter("a")
        .HasParameter("b")
        .HasParameter("c")
        .HasParameter("d").HasDefaultValue(null)
        .HasParameter("e").HasDefaultValue(null)
        .HasParameter("f").HasDefaultValue(null);
    

关键注意事项:

  • HasName中的函数名必须和数据库里的函数名严格匹配(PostgreSQL默认对标识符小写处理,除非创建函数时用双引号指定了大小写)。
  • 如果数据库函数的可选参数默认值不是null,要把HasDefaultValue(null)改成对应的默认值。
  • 显式配置参数默认值后,EF Core会直接使用你指定的配置,不再依赖反射获取空值信息,从而绕过报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:02:11