小巧精致的:对于结构自定义类型处理器

问题描述 投票:1回答:1

我的目标是创建一个包装双定制结构,并使用了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)

.net dapper
1个回答
0
投票

综观看来你需要使用不同的重载设置类型处理器的源代码的测试:

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

将不被使用。

© www.soinside.com 2019 - 2024. All rights reserved.