我的目标是创建一个包装双定制结构,并使用了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());
做直接登记
任何人都可以用这个问题帮助吗?
附:我使用的是小巧玲珑的1.50.5,Dapper.ParameterExtensions 2018.12.7.1 Asp.NET核心内部应用程序(2.1)
综观看来你需要使用不同的重载设置类型处理器的源代码的测试:
https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L101
而且类型Handler类略有不同:
https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L116
作为构造函数设置为私有,以确保平时methon
SqlMapper.AddTypeHandler<T>(TypeHandler<T>)
将不被使用。