Как мне игнорировать свойство типа целевой коллекции при сопоставлении с использованием AutoMapper?

#c# #automapper

#c# #automapper

Вопрос:

Я сопоставляю входную модель (источник) с моделью домена (назначение)

Класс назначения имеет список объектов определенного типа, и этот тип обладает свойствами, которые не относятся к типу исходного списка

Это вызывает следующее исключение

Исключение AutoMapperConfigurationException: были найдены несопоставленные элементы. Просмотрите типы и элементы ниже.

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

Как я могу гарантировать, что в типе объекта коллекции моделей домена могут существовать свойства, которые ни с чем не сопоставлены?

Вот MRE https://github.com/jstallm/AutomapperListIssue-MRE

В этом MRE вы можете видеть, что входная модель имеет список типа Class1InputModel. Class1InputModel имеет свойство Description, на которое automapper вообще не жалуется.

Однако класс DomainModel имеет список типа Class1DomainModel, который содержит поле с именем Other . Это единственное свойство, вызывающее проблемы. По сути, после успешного сопоставления я хочу, чтобы свойство «Other» было нулевым.

Ответ №1:

Место, где вы определяете сопоставление, например

 CreateMap<Source, Destination>();
  

Вы можете игнорировать конкретное поле ниже

 CreateMap<Source, Destination>().ForMember(x => x.Destination, opt => opt.Ignore());
  

Комментарии:

1. Можете ли вы взглянуть на MRE, который я создал здесь, и сообщить мне, применимо ли это? github.com/jstallm/AutomapperListIssue-MRE

2. Я просмотрел ваш код, и вам нужно сделать только одно: «CreateMap<InputModel, DomainModel>()» измените его как => CreateMap<InputModel, DomainModel>(x => x.Назначение, opt => opt. Игнорировать());

3. Я использую Automapper 11.0.1 и из 100 свойств в типе назначения я получал ошибку для одного int? свойство, которое даже не было определено в сопоставлении, но каким-то образом Automapper пытался сопоставить его, и вторая строка в вашем решении полезна для игнорирования определенного свойства типа назначения, которое следует игнорировать.

Ответ №2:

Вы можете игнорировать этот список :

 Mapper.CreateMap<SourceType, DestinationType>()
    .ForMember(dst => dst.SpecialProperty, opt => opt.Ignore());
  

Другие варианты — добавить сопоставление для каждого типа элемента списка и игнорировать только отсутствующие свойства типа списка, и тогда вам не нужно игнорировать список в родительском сопоставлении, например :

 Mapper.CreateMap<SourceType, DestinationType>();

Mapper.CreateMap<SourceListItemsType, DestinationListItemsType>()
    .ForMember(dst => dst.SpecialProperty1, opt => opt.Ignore()
    .ForMember(dst => dst.SpecialProperty2, opt => opt.Ignore()
    .ForMember(dst => dst.SpecialProperty3, opt => opt.Ignore()
    .ForMember(dst => dst.SpecialProperty4, opt => opt.Ignore());
  

Комментарии:

1. Можете ли вы взглянуть на MRE, который я создал здесь, и сообщить мне, применимо ли это? github.com/jstallm/AutomapperListIssue-MRE

2. вы должны создать map для Class1InputModel и игнорировать свойства

3. Mapper. CreaeMap<Class1InputModel, Class1DomainModel>() .ForMember(dst => летнее время. Другое, opt => выбрать. Игнорировать());

Ответ №3:

Исключение больше не генерируется только благодаря созданию простого сопоставления между самими списками. Игнорирование не требуется.

Просто добавьте профиль для самих списков введите описание изображения здесь

Затем убедитесь, что оно добавлено в mapperconfiguration

введите описание изображения здесь

Комментарии:

1. смотрите мой ответ и комментарии