使用dapper并将一列映射到json

时间:2017-05-02 13:18:28

标签: c# dapper

我有一个表格,我将字典作为json存储在一列中。在向/从数据库保存/加载内容时,如果可能的话,我希望能够使json de / serialization不可见。是否有可能以某种方式使用dapper而不使用包含json表示的Foo中的另一个属性?

// where someData is the dictionary column
void Save(IDbConnection conn, Foo foo){
    conn.Execute("INSERT INTO foos (name, <othercols...>, someData) VALUES (@Name, <othercols...>, @SomeData, foo);
}

我可以手动将Foo映射到一个新的动态对象,但是由于其他列很繁琐,所以我想知道是否还有其他方法?

1 个答案:

答案 0 :(得分:4)

您可以通过实施ITypeHandler来实现它。

Dictionary<int, string>的示例实现:

class DictTypeHandler : ITypeHandler
{
    public object Parse(Type destinationType, object value)
    {
        return JsonConvert.DeserializeObject<Dictionary<int, string>>(value.ToString());
    }

    public void SetValue(IDbDataParameter parameter, object value)
    {
        parameter.Value = (value == null)
            ? (object)DBNull.Value
            : JsonConvert.SerializeObject(value);
        parameter.DbType = DbType.String;
    }
}

如果您使用SqlMapper.AddTypeHandler(typeof(DictTypeHandler), new DictTypeHandler())

将Dapper添加到已知处理程序,Dapper将使用该处理程序

如果你的sql-column是varchar(max),请注意将IDbDataParameter.DbType设置为字符串,否则Dapper将使用不能转换为varchar(max)的sql_variant。

如果您通过存储库模式实现持久性,则可以将AddTypeHandler代码添加到构造函数中。