【问题标题】:Automapper: validation exception ignoring destination propertyAutomapper:忽略目标属性的验证异常
【发布时间】:2021-12-23 17:47:18
【问题描述】:

我在尝试忽略目标属性时遇到了麻烦

源类:

public class ClassDto
{
    public int Id { get; set; }
}

目的地类:

public class ClassModel
{

    public int Id { get; set; }

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

}

例子:

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

    }
}

不幸的是 config.AssertConfigurationIsValid();引发异常:

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

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

提前致谢

【问题讨论】:

  • UseDestinationValue() 并不意味着忽略映射成员。这意味着不要使用新对象对其进行初始化(如果已映射,则映射到现有值)。 AutoMapper 仍会尝试映射该成员。如果没有匹配的源成员映射,验证将抛出异常,因为UseDestinationValue() 表示无论映射是否存在都保留成员的现有值。令人困惑的命名选择,但这就是它的工作原理。

标签: c# .net mapping automapper


【解决方案1】:

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

Automapper 提供属性 Ignore 告诉映射器不要 从源类中获取属性的值。 忽略不仅 忽略属性的映射,同时也忽略 的映射 所有内在属性。这意味着如果属性不是原始的 类型,但是另一个类,如果你使用 Ignore,这个类 属性不会被映射。所以,A.B.C 将是 A.Null。

所以尝试使用这个:

.ForMember(x => x.ListString, opt => opt.Ignore())

【讨论】:

  • 据我所知,Ignore 已经过时,我们必须使用 DoNotUseDestinationValue
  • 好吧,我的错,我不知道这个,你有任何关于这个的有效消息来源吗?
  • 好吧,我犯了一个错误。我无法访问我阅读的文档并且您的解决方案有效。所以谢谢,没关系
  • 没问题!乐于助人^_^
  • Ignore() 将绕过目标成员的映射。 UseDestinationValue() 不会用新构造的对象替换目标成员,但仍会尝试映射它。但是,UseDestinationValue() 有一个微妙的错误,它会抛出一个验证异常,即该成员仍然未映射,即使它是。如果您知道不存在源成员,请使用Ignore()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多