Phiên bản ngắn
SqlMapper.Query<T>
dường như bỏ qua đăng ký của tôi TypeHandler<T>
TypeHandler <T> dường như không được gọi
Phiên bản dài
Dưới đây là một truy vấn đơn giản:
SELECT 'Foo' AS CategoryName, 200 AS CategoryRating
. ..và đây là hai 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; }
}
Tôi đã tạo một TypeHandler
thực hiện mới mà nên biến mà CategoryRating Int32
vào một đối tượng 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);
}
}
Bây giờ, trước khi chạy truy vấn của tôi tôi thêm xử lý mới của tôi như thế này:
SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());
Tuy nhiên, khi tôi chạy điều này:
c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");
Tôi nhận được ngoại lệ từ Dapper - nó không thể phân tích cú pháp kết quả trong cột 1. Tôi mong đợi Dapper để kích hoạt trình xử lý loại tùy chỉnh của tôi!
Tôi nghĩ rằng tôi đang thiếu thứ gì đó rất, rất rõ ràng. Vui lòng cho tôi biết tôi thật ngốc nghếch!
Tại sao thankyou - một đỉnh của mũ của tôi với bạn, thưa ông :) – Dan
gì về SqlMapper.AddTypeHandler (StringDictionaryValueHandler mới()); lớp công khai StringDictionaryValueHandler: SqlMapper.TypeHandler> {...} –