.net - Dapper:结构的自定义类型处理程序
问题描述
我的目标是创建包装双的自定义结构并使用 Dapper 将其保存到数据库中。不幸的是,我遇到了一个我无法解决的问题。
我创建了以下结构:
public struct MyDouble
{
private readonly double value;
public static implicit operator MyDouble(double val)
{
return new MyDouble(val);
}
public static explicit operator double(MyDouble val)
{
return val.value;
}
public static explicit operator MyDouble(int val)
{
return new MyDouble(val);
}
public MyDouble(double val)
{
this.value = Process(val);
}
public double GetDouble()
{
return this.value;
}
}
并添加了此处描述的自定义类型处理程序(https://medium.com/dapper-net/custom-type-handling-4b447b97c620)
public class MyDoubleTypeHandler : SqlMapper.TypeHandler<MyDouble>
{
public override MyDouble Parse(object value)
{
return (MyDouble)value;
}
public override void SetValue(IDbDataParameter parameter, MyDouble value)
{
parameter.DbType = DbType.Double;
parameter.Value = value.GetDouble();
}
}
我的自定义对象MyDouble
里面有道具:
public class MyObject
{
public MyDouble Prop1 { get; set; }
}
保存方法如下所示:
public async Task<bool> Save(List<MyObject> data)
{
SqlMapper.ResetTypeHandlers();
SqlMapper.AddTypeHandler(new MyDoubleTypeHandler());
parameters.AddTable("@Data", "dbo.MyObject", data.AsList());
using (var connection = new SqlConnection(connectionString))
{
await connection.OpenAsync();
return await connection.ExecuteAsync("name-of-sp", parameters, commandType: CommandType.StoredProcedure);
}
}
结果我得到这个错误:“System.ArgumentException:不支持列'Prop1'的类型。类型是'MyDouble'”。
似乎我的自定义类型处理程序尚未注册,尽管我直接通过调用SqlMapper.AddTypeHandler(new MyDoubleTypeHandler());
任何人都可以帮助解决这个问题吗?
PS 我在 Asp.NET Core 应用程序 (2.1) 中使用 Dapper 1.50.5、Dapper.ParameterExtensions 2018.12.7.1
解决方案
查看源代码中的测试,您似乎需要使用不同的重载来设置类型处理程序:
https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L101
并且 Type Handler 类也略有不同:
https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L116
因为构造函数设置为私有以确保通常的方法
SqlMapper.AddTypeHandler<T>(TypeHandler<T>)
不会被使用。
推荐阅读
- python - 如何使用预发布版本的 Tensorflow 更新模型以在 Google Colab 实例中运行?
- python - 在 C++/Cython 中,是否可以只声明相关属性在 Python 中可见?
- javascript - 如何在提交表单之前检测输入字段上的 ENTER 键按下?
- flutter - 在 Flutter 中为 showDatePicker 添加标题
- elixir - 长生不老药将标题字符串转换为地图
- java - 将 Java 连接到 SQL 数据库
- python - 为什么 SpaCy 在 Pypi 上不再有版本 <2.0.0 的轮子?
- typescript - 尝试访问我的 lambda 时出现 AWS/Serverless Unknown 错误
- php - Laravel / PHP Unit Test failing after update
- python - Remove elements of a list of lists with another list