C# 是否未调用Dapper自定义TypeHandler SetValue?
因此,我有一个数据类型,其中包含一些C# 是否未调用Dapper自定义TypeHandler SetValue?,c#,dapper,typehandler,C#,Dapper,Typehandler,因此,我有一个数据类型,其中包含一些列表,由于我想在表列中将这些数据序列化为Json,我为列表添加了一个简单的TypeHandler: class Foo:SqlMapper.TypeHandler { 公共覆盖无效设置值(IDbDataParameter参数,列表值) { //从不打 抛出新的NotImplementedException(); } 公共覆盖列表解析(对象值) { var val=字符串形式的值; 如果(val!=null) { var list=JsonConvert.Des
列表
,由于我想在表列中将这些数据序列化为Json,我为列表
添加了一个简单的TypeHandler:
class Foo:SqlMapper.TypeHandler
{
公共覆盖无效设置值(IDbDataParameter参数,列表值)
{
//从不打
抛出新的NotImplementedException();
}
公共覆盖列表解析(对象值)
{
var val=字符串形式的值;
如果(val!=null)
{
var list=JsonConvert.DeserializeObject(val);
退货清单;
}
抛出新异常(“未知值?”);
}
}
AddTypeHandler(新的Foo());
我试图更新一条记录,但是SqlMapper.ExecuteCommand
似乎没有调用列表上的SetValue(尽管在读取字段时,正确调用了解析)。相反,它会错误地告诉我,我的sql在“,”附近有一个错误-我以前使用过相同的sql,所以我知道这很好。对于参数,我传递的是List
类型的属性,而不是在设置参数值时序列化它们。我尝试过修改查询,删除List
中的所有参数,它可以完美地工作。我还删除了除一个List
param之外的所有参数,但仍然得到相同的错误,即我的SQL在“,”附近出错
我仔细检查了命令中的数据类型是否确实是List
,而不是ICollection
的其他实现,因此应该调用SetValue
也许值得指出的是,我正在使用SQLite
我做错了什么,还是这是一个错误?我注意到没有答案
更新:我做了很多挖掘工作,认为我可能发现了一个bug——不过我希望有更了解情况的人这样说。我有一个名为Foo的带有两个字符串值的列表
参数,SetupCommand
正在尝试将Foo1和Foo2绑定到基础cmd。我假设这是可枚举的内部处理,但我的自定义数据类型不应该具有更高的优先级吗
单步执行后:下面是-此代码下面的
trygetvalue
的简单交换,所有操作都按预期进行-我对列表的处理将取代默认的可枚举处理。修复?该漏洞现在已在Dapper.Net中修复
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());