Обработчик Dapper Mapper для DateTimeOffset - PullRequest
0 голосов
/ 29 января 2019

У нас есть несколько интеграционных тестов, которые извлекают столбцы, которые представляют собой DateTimeOffsets в SQL (при выполнении более сложных запросов), но возвращают DateTimes при работе с SqlLite в базе данных памяти, поскольку он не поддерживает этот тип столбца.

Мне нужно создать обработчик / конвертер для преобразования из DateTime в DateTimeOffset для этих тестов.

Когда я пытаюсь использовать обработчик (ниже), код все еще взрывается с невозможностью преобразовать DateTime в DateTimeOffset.Могут ли это быть другие обработчики в нашей кодовой базе, потому что это примитив, а не пользовательский тип?И если да, то есть ли способ создать маппер, который будет конвертировать в DateTimeOffset, с часовым поясом по умолчанию, например, UTC?

Dapper.SqlMapper.AddTypeHandler<DateTimeOffset>(
                new DateTimeOffSetInMemoryTestHandler());
var result = dbExecutor.Query<dynamic>(sql,
                new { Reference = myReference}).ToList();
return Dapper.AutoMapper.MapDynamic<MyObject>(result).FirstOrDefault();

// Обработчик

 public class DateTimeOffSetInMemoryTestHandler : SqlMapper.TypeHandler<DateTimeOffset>
    {
        public DateTimeOffSetInMemoryTestHandler()
        {

        }
        public override DateTimeOffset Parse(object value)
        {
            try
            {
                return (DateTimeOffset)value;
            }
            catch (Exception)
            {
                return new DateTimeOffset((DateTime)value, TimeZoneInfo.Utc.BaseUtcOffset);
            }
        }

        public override void SetValue(IDbDataParameter parameter, DateTimeOffset value)
        {
            throw new NotImplementedException("This Handler DateTimeOffSetInMemoryTestHandler, should only be used in tests");
        }
    }
...