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即可。 - 确保项目已经安装了
NpgsqlNuGet包,否则无法引用NpgsqlParameter和NpgsqlDbType。
内容的提问来源于stack exchange,提问作者r00xus
相关产品推荐
相关产品推荐

