使用AutoMapper映射时如何忽略目标集合类型属性?

4
我正在从输入模型(源)映射到领域模型(目标)
目标类有一个类型的对象列表,该类型具有在源列表类型上不存在的属性
这导致以下异常
AutoMapperConfigurationException:找到未映射的成员。请查看下面的类型和成员。
奇怪的是,当输入模型集合对象类型具有未包含在域模型集合对象类型中的属性时,不会抛出任何异常。只有反过来才会出现异常。
如何确保可以在域模型集合对象类型上存在未映射到任何内容的属性?
这是MRE https://github.com/jstallm/AutomapperListIssue-MRE 在这个MRE中,您可以看到输入模型具有Class1InputModel类型的列表。 Class1InputModel具有Description属性,Automapper对此毫不抱怨。
然而,类DomainModel具有类型为Class1DomainModel的列表,其中包含名为Other的字段。这是唯一引起问题的属性。基本上,在成功映射后,我希望属性“Other”为null。
3个回答

3

您可以忽略此列表:

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());

你能否查看我在这里创建的MRE并告诉我是否适用?https://github.com/jstallm/AutomapperListIssue-MRE - Judy007
你应该为 Class1InputModel 创建一个映射,忽略属性。 - AnGG
Mapper.CreateMap<Class1InputModel, Class1DomainModel>() .ForMember(dst => dst.Other, opt => opt.Ignore()); - AnGG

3
您需要定义映射的地方,例如:
CreateMap<Source, Destination>();

您可以忽略以下特定字段。
CreateMap<Source, Destination>().ForMember(x => x.Destination, opt => opt.Ignore());

你能否查看我在这里创建的MRE并告诉我是否适用?https://github.com/jstallm/AutomapperListIssue-MRE - Judy007
我看了你的代码,你需要做的只有一件事:将 "CreateMap<InputModel, DomainModel>()" 改为 => CreateMap<InputModel, DomainModel>(x => x.Destination, opt => opt.Ignore()); - Engincan Veske
我正在使用Automapper 11.0.1版本,目标类型中有100个属性,但其中一个int?属性出现了错误,即使在映射中未定义该属性,但Automapper仍然尝试进行映射。你提供的解决方案中的第二行代码非常有用,可以忽略目标类型中特定的属性。 - sanpat

0

通过简单地在列表之间创建映射,异常不再被抛出。无需忽略。

只需为列表本身添加一个配置文件 enter image description here

然后确保将其添加到mapperconfiguration中

enter image description here


请查看我的回答和评论。 - AnGG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接