Dapper: пользовательский тип обработчик для структуры - PullRequest
0 голосов
/ 30 января 2019

Моя цель - создать собственную структуру с двойным переносом и сохранить ее в базе данных с помощью 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 prop внутри:

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 Я использую Dapper 1.50.5, Dapper.ParameterExtensions 2018.12.7.1 внутри приложения Asp.NET Core (2.1)

1 Ответ

0 голосов
/ 03 февраля 2019

Глядя на тесты в исходном коде, кажется, что вам нужно использовать другую перегрузку для установки обработчика типов:

https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L101

, а также класс обработчика типов немного отличается:

https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L116

, поскольку конструктор настроен как частный, чтобы гарантировать, что обычный метон

SqlMapper.AddTypeHandler<T>(TypeHandler<T>)

не будетиспользоваться.

...