Automapper:验证异常忽略目标属性

lun*_*c84 1 .net c# mapping automapper

我在尝试忽略目标属性时遇到问题

源码类:

public class ClassDto
{
    public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

目的地舱位:

public class ClassModel
{

    public int Id { get; set; }

    public IList<string> ListString { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

例子:

public class Program
{
    static void Main(string[] args)
    {
        var dto = new ClassDto { Id = 1 };

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<ClassDto, ClassModel>().
            ForMember(i => i.ListString, opt => opt.DoNotUseDestinationValue()); 
        });

        config.AssertConfigurationIsValid();

        var mapper = config.CreateMapper();

        var model = mapper.Map<ClassDto, ClassModel>(dto);

    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是 config.AssertConfigurationIsValid(); 出现异常:

$exception {"\n找到未映射的成员。检查下面的类型和成员。\n添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型\n如果没有匹配的构造函数,请添加无参数构造函数、添加可选参数或映射所有构造函数参数\n====================================== ===============\r\nClassDto -> ClassModel(目标成员列表)\r\nAutoMapperFoo.ClassDto -> AutoMapperFoo.ClassModel(目标成员列表)\r\n\r\ n未映射的属性:\r\nListString\r\n"} AutoMapper.AutoMapperConfigurationException

我无法理解为什么,我明确地通过 DoNotUseDestinationValue 忽略 ListString

提前致谢

TBA*_*TBA 5

默认情况下,当源类型和目标类型属性名称相同时,AutoMapper 会尝试将所有属性从源类型映射到目标类型。如果您希望某些属性不与目标类型属性映射,则需要使用 C# 中的 AutoMapper Ignore Property。了解更多AutoMapper 忽略 C# 中的属性

Automapper 提供了Ignore属性,它告诉映射器不要从源类中获取属性的值。忽略不仅忽略属性的映射,还忽略所有内部属性的映射。这意味着如果属性不是基本类型,而是另一个类,那么如果您使用“忽略”,则不会映射此类属性。因此,ABC 将是 A.Null。

所以尝试使用这个:

.ForMember(x => x.ListString, opt => opt.Ignore())
Run Code Online (Sandbox Code Playgroud)

  • `Ignore()` 将绕过目标成员的映射。`UseDestinationValue()` 不会用新构造的对象替换目标成员,但仍会尝试映射它。然而,“UseDestinationValue()”有一个微妙的错误,它会抛出一个验证异常,表明该成员仍然未映射,即使它是。如果您知道不存在源成员,请使用“Ignore()”。 (3认同)