【发布时间】:2014-09-04 14:49:06
【问题描述】:
短版
SqlMapper.Query<T>似乎忽略了我注册的TypeHandler<T>
长版
这是一个简单的查询:
SELECT 'Foo' AS CategoryName, 200 AS CategoryRating
...这里有两个 POCO:
public class RatingValue
{
public Int32 Value { get; set; }
// ... some other properties etc ...
}
public class MyResult
{
public String CategoryName { get; set; }
public RatingValue CategoryRating { get; set; }
}
我创建了一个新的 TypeHandler 实现,应该将 CategoryRating Int32 转换为 RatingValue 对象:
public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
public override RatingValue Parse(object value)
{
if (value is Int32)
return new RatingValue() { Value = (Int32)value };
throw new FormatException("Invalid conversion to RatingValue");
}
public override void SetValue(System.Data.IDbDataParameter parameter, RatingValue value)
{
// ... null, range checks etc ...
parameter.DbType = System.Data.DbType.Int32;
parameter.Value = Int32.Parse(value.Value);
}
}
现在,在运行我的查询之前,我要像这样添加我的新处理程序:
SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());
但是,当我运行这个时:
c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");
我从 Dapper 那里得到一个异常 - 它无法解析第 1 列中的结果。 我预计 Dapper 会触发我的自定义类型处理程序!
我认为我遗漏了一些非常非常明显的东西。请告诉我我有多傻!
【问题讨论】:
标签: c# type-conversion dapper