我们有一些集成测试,它们检索SQL中的DateTimeOffsets列(执行dapper查询时),但是在内存数据库中针对SqlLite运行时返回DateTimes,因为它不支持此列类型。
对于这些测试,我需要创建一个处理程序/转换器以将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");
}
}