Как обрабатывать недопустимые даты с Automapper? - PullRequest
1 голос
/ 09 января 2020

Итак, у меня есть исходный столбец БД с датой, в которой типом является строка, а не дата, так что можно ожидать, что иногда встречаются недопустимые даты, такие как «10-31-». Источник вне моего контроля, поэтому я не могу исправить это там (добавить проверку). Я использую automaper (версия 9), и я пытался использовать .MapFrom, но, честно говоря, я достаточно новичок в Automapper и не имею никакого реального представления о том, что я делаю. Я прочитал документацию, и она мне не помогла.

Столбец даты назначения может иметь значение NULL, поэтому я хотел бы получить нулевое значение, если строка не конвертируется в дату.

CreateMap<Models.Orders, DTO.Orders>()
.ForMember(dest => dest.ap_birthday, opt => opt.AllowNull() );

1 Ответ

3 голосов
/ 10 января 2020

Этого можно добиться с помощью преобразователя типов , например:

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?.

В качестве альтернативы вы также можете использовать преобразователь значений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...