Dapper解析嵌套的多层实体类

在作项目的时候,我会将一些不涉及查询的字段,形成JSON统一存放在一个字段中,向下面这样的来建实体类,

public class WechatModel
{
        public string wechatid { get; set; }    
        public WxMpModel wxmpinfo { get; set; }
}
public class WxMpModel
{
       public string appid { get; set; }
       public string secret { get; set; }
       public string token { get; set; }
}

表字段为

[wechatid] [varchar](50) NOT NULL,
[wxmpinfo] [varchar](max) NULL

但是在用Dapper向数据库存取的时候,Dapper会报异常,无法序列化,解决方法为,新建一个转换类,在使用前注册一下

    public class JsonConvertHandler<T> : SqlMapper.TypeHandler<T>
    {
        public override T Parse(object value)
        {
            return JsonConvert.DeserializeObject<T>((string)value);
        }

        public override void SetValue(IDbDataParameter parameter, T value)
        {
            parameter.Value = JsonConvert.SerializeObject(value);
        }
    }

使用示例

SqlMapper.AddTypeHandler(new JsonConvertHandler<WxMpModel>());
DapperHelper.Execute(strSql.ToString(), model);

如此,大功告成,新增,编辑,获取实体,均可正常解析

 

2022-06-19 此方法依旧有一定BUG,在SqlMapper.AddTypeHandler过多的情况下,会出现转换失败,并且错误会持续,重启应用可以搞定,慎用

posted @ 2020-03-28 09:25  拼博之路  阅读(1181)  评论(0编辑  收藏  举报