如何使用 Automapper 处理无效日期?
How to handle invalid dates with Automapper?
所以我有一个源数据库列,其中的日期类型是字符串,而不是日期,所以正如您所料,偶尔会有无效日期,例如“10-31-”。来源超出了我的控制范围,所以我无法在那里修复它(添加验证)。我正在使用 automaper(第 9 版)并且我一直在尝试使用 .MapFrom 但老实说,我对 Automapper 相当陌生并且不知道我在做什么。我已经阅读了文档,但对我没有帮助。
目标日期列可以为空,因此如果字符串不可转换为日期,我想得到一个空值。
CreateMap<Models.Orders, DTO.Orders>()
.ForMember(dest => dest.ap_birthday, opt => opt.AllowNull() );
您可以使用 type converter 实现此目的,例如:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime?>
{
public DateTime? Convert(string source, DateTime? destination, ResolutionContext context)
{
if (DateTime.TryParse(source, out DateTime result))
return result;
return null;
}
}
这只是一个可能的类型转换器的例子。当字符串被成功解析时,你将得到一个 DateTime
结果,否则将返回 null
。当然,您可以根据需要调整转换。
然后您可以像这样使用转换器:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<string, DateTime?>().ConvertUsing(new DateTimeTypeConverter());
cfg.CreateMap<OrderDto, Order>();
});
var mapper = config.CreateMapper();
var orderDTO = new OrderDto();
orderDTO.id = 1;
orderDTO.orderDate = "2020-01-01";
var order = mapper.Map<Order>(orderDTO); // orderDate will be "2020-01-01"
orderDTO.orderDate = "10-31";
var otherorder = mapper.Map<Order>(orderDTO); // orderDate will be null
行 cfg.CreateMap<string, DateTime?>()...
告诉 AutoMapper 每次需要从 string
转换为 DateTime?
时使用此转换器。
作为替代方案,您也可以使用 value converter.
所以我有一个源数据库列,其中的日期类型是字符串,而不是日期,所以正如您所料,偶尔会有无效日期,例如“10-31-”。来源超出了我的控制范围,所以我无法在那里修复它(添加验证)。我正在使用 automaper(第 9 版)并且我一直在尝试使用 .MapFrom 但老实说,我对 Automapper 相当陌生并且不知道我在做什么。我已经阅读了文档,但对我没有帮助。
目标日期列可以为空,因此如果字符串不可转换为日期,我想得到一个空值。
CreateMap<Models.Orders, DTO.Orders>()
.ForMember(dest => dest.ap_birthday, opt => opt.AllowNull() );
您可以使用 type converter 实现此目的,例如:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime?>
{
public DateTime? Convert(string source, DateTime? destination, ResolutionContext context)
{
if (DateTime.TryParse(source, out DateTime result))
return result;
return null;
}
}
这只是一个可能的类型转换器的例子。当字符串被成功解析时,你将得到一个 DateTime
结果,否则将返回 null
。当然,您可以根据需要调整转换。
然后您可以像这样使用转换器:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<string, DateTime?>().ConvertUsing(new DateTimeTypeConverter());
cfg.CreateMap<OrderDto, Order>();
});
var mapper = config.CreateMapper();
var orderDTO = new OrderDto();
orderDTO.id = 1;
orderDTO.orderDate = "2020-01-01";
var order = mapper.Map<Order>(orderDTO); // orderDate will be "2020-01-01"
orderDTO.orderDate = "10-31";
var otherorder = mapper.Map<Order>(orderDTO); // orderDate will be null
行 cfg.CreateMap<string, DateTime?>()...
告诉 AutoMapper 每次需要从 string
转换为 DateTime?
时使用此转换器。
作为替代方案,您也可以使用 value converter.