Dapper自定义TypeHandler SetValue没有被调用?

时间:2015-02-25 19:31:54

标签: c# dapper typehandler

所以,我有一个包含一些List<string>的数据类型,并且我想在表格列中将这些序列化为Json,我为List<string>添加了一个简单的TypeHandler:

class Foo : SqlMapper.TypeHandler<List<string>>
{
    public override void SetValue(IDbDataParameter parameter, List<string> value)
    {
        // never hit
        throw new NotImplementedException();
    }

    public override List<string> Parse(object value)
    {
        var val = value as string;
        if (val != null)
        {
            var list = JsonConvert.DeserializeObject<List<string>>(val);
            return list;
        }
        throw new Exception("unknown value?");

    }
}

SqlMapper.AddTypeHandler<List<string>>(new Foo());

我尝试更新记录,但SqlMapper.ExecuteCommand似乎没有在列表上调用SetValue(尽管在读取字段时,正确调用了Parse)。相反,它错误告诉我,我的sql附近有一个错误,&#39;&#39; - 我之前使用过相同的SQL,所以我知道它很好。对于参数,我传递类型为List<string>的属性,而不是在设置参数值时序列化它们。我尝试修改查询,删除List<string>的所有参数,并且它完美无瑕。除了一个List<string>参数之外,我还删除了所有参数,但我仍然得到与我的SQL错误相同的错误,&#39;,&#39;。

我已经仔细检查过命令中的数据类型确实是List<string>而不是ICollection<string>的其他实现,因此应该调用SetValue

也许值得指出我使用的是SQLite。

我做错了什么,或者这是一个错误?我注意到a similar question没有答案。

更新:我已经做了很多挖掘,并认为我可能发现了一个错误 - 尽管希望有更多知识的人这样说。我有一个名为Foo的List<string> param,带有两个字符串值,而SetupCommand正试图将Foo1和Foo2绑定到底层cmd。我假设这是可枚举的内部处理,但我的自定义数据类型不应该具有更高的优先级吗?

在单步执行之后:problem - 在此代码下方简单地交换trygetvalue,所有内容都按预期工作 - 我对列表的处理取代了默认{{1}处理。修复?

0 个答案:

没有答案
相关问题