首页 > 解决方案 > 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

标签: .netdapper

解决方案


查看源代码中的测试,您似乎需要使用不同的重载来设置类型处理程序:

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>)

不会被使用。


推荐阅读