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

Dapper搭配PostgreSQL:自定义JSONB类型处理器报错解决方案

解决PostgreSQL JSONB类型与Dapper自定义类型处理器的映射问题

你的问题核心是没有给Npgsql参数指定正确的JSONB类型标识,仅设置DbType.String会让PostgreSQL把传入值识别为text类型,和表中jsonb字段类型不匹配,从而抛出类型错误。

解决方案

修改自定义类型处理器的SetValue方法,针对Npgsql参数设置专属的NpgsqlDbType.Jsonb类型,同时保留JSON序列化逻辑即可。

修改后的完整代码

using Npgsql;
using Newtonsoft.Json;
using System.Data;
using Dapper;

public class JsonbTypeHandler : SqlMapper.ITypeHandler
{
    public void SetValue(IDbDataParameter parameter, object value)
    {
        // 针对Npgsql参数设置JSONB类型
        if (parameter is NpgsqlParameter npgsqlParam)
        {
            npgsqlParam.NpgsqlDbType = NpgsqlDbType.Jsonb;
        }

        // 序列化值,空值处理为DBNull
        parameter.Value = value == null 
            ? DBNull.Value 
            : JsonConvert.SerializeObject(value);
    }

    public object Parse(Type destinationType, object value)
    {
        // 反序列化,空值返回null
        return value == DBNull.Value 
            ? null 
            : JsonConvert.DeserializeObject(value.ToString(), destinationType);
    }
}

注册类型处理器(和之前一致)

SqlMapper.AddTypeHandler(typeof(IEnumerable<string>), new JsonbTypeHandler());

补充说明

  • 如果你的数据库字段是json类型而非jsonb,只需把NpgsqlDbType.Jsonb改成NpgsqlDbType.Json即可。
  • 确保项目已经安装了Npgsql NuGet包,否则无法引用NpgsqlParameter和NpgsqlDbType。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:20:06