Automapper пытается создать объект, когда карта возвращает ноль - PullRequest
0 голосов
/ 09 апреля 2019

Когда я пытаюсь выполнить какое-либо настраиваемое сопоставление и иногда сопоставить целевое свойство со значением NULL, Automapper генерирует исключение, пытаясь создать целевой объект свойства.

Я загрузил упрощенный проект в github, чтобы продемонстрировать: https://github.com/dreing1130/AutoMapper_Investigation

Это началось, когда я обновил Automapper 6 до 8.

Если я вернул новую версиюобъект вместо нуля работает нормально (мое приложение ожидает, что это значение будет нулевым в этих случаях)

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

public class Source
{
    public IEnumerable<string> DropDownValues { get; set; }
    public string SelectedValue { get; set; }
}

public class Destination
{
    public SelectList DropDown { get; set; }
}

CreateMap<Source, Destination>()
        .ForMember(d => d.DropDown, o => o.MapFrom((src, d) =>
        {
            return src.DropDownValues != null
                ? new SelectList(src.DropDownValues,
                    src.SelectedValue)
                : null;
        }));

Ожидаемый результат: Destination.DropDown равен null, когда Source.DropdownValues ​​равен нулю

Фактический результат: выброшено исключение

"Система.Web.Mvc.SelectList должен иметь конструктор с 0 аргументами или только с необязательными аргументами. Имя параметра: тип "

1 Ответ

1 голос
/ 09 апреля 2019

Здесь можно использовать PreCondition, что позволит избежать сопоставления (и даже попыток разрешить исходное значение), если указанное условие не выполняется:

CreateMap<Source, Destination>()
    .ForMember(d => d.DropDown, o =>
    {
        o.PreCondition(src => src.DropDownValues != null);
        o.MapFrom((src, d) =>
        {
            return new SelectList(src.DropDownValues, src.SelectedValue);
        });
    });

причина для этого объясняется здесь :

Для каждого сопоставления свойств AutoMapper пытается разрешить значение назначения перед оценкой условия.Поэтому он должен быть в состоянии сделать это, не вызывая исключения, даже если условие не позволит использовать полученное значение.

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