【问题标题】:AutoMapper inheritance errorAutoMapper 继承错误
【发布时间】:2015-06-09 16:30:51
【问题描述】:

我有以下抽象类

public abstract class BaseClass
{
    public int NumberProperty { get; set; }
}

public abstract class BaseClass_DTO
{
    public int NumberProperty { get; set; }
    public string NumberPropertyAsString { get; set; }
}

以及下面的具体类

public class ConcreteA : BaseClass
{
    public string StringProperty { get; set; }
}

public class ConcreteA_DTO : BaseClass_DTO
{
    public string StringProperty { get; set; }
}

这是地图

Mapper.Initialize( cfg => {
    cfg.CreateMap<BaseClass, BaseClass_DTO>()
        .ForMember( p => p.NumberPropertyAsString, opt => opt.MapFrom( x => x.NumberProperty.ToString() ) );
    cfg.CreateMap<ConcreteA, ConcreteA_DTO>()
        .IncludeBase<BaseClass, BaseClass_DTO>()
        .ReverseMap();
} );
Mapper.AssertConfigurationIsValid();

代码说配置无效是因为

Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
=============================================================================
ConcreteA_DTO -> ConcreteA (Source member list)
Temporary.Test.ConcreteA_DTO -> Temporary.Test.ConcreteA (Source member list)

Unmapped properties:
NumberPropertyAsString

由于ReverseMap() 调用而发生错误。如何设置反向映射忽略成员而不复制映射?

【问题讨论】:

    标签: c# mapping automapper automapper-3


    【解决方案1】:

    您需要使用

    忽略反向映射中的NumberPropertyAsString
    .ReverseMap()
       .ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
    

    看来,在您的特定映射配置中,您应该在基础和混凝土中进行配置both

    1.在基类映射中。

    cfg.CreateMap<BaseClass, BaseClass_DTO>()
        .ForMember(p => p.NumberPropertyAsString, opt => opt.MapFrom(x => x.NumberProperty.ToString()))
        .ReverseMap()
              .ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
    

    2。在具体的类映射中。

    cfg.CreateMap<ConcreteA, ConcreteA_DTO>()
        .IncludeBase<BaseClass, BaseClass_DTO>()
        .ReverseMap()
             .ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
    

    【讨论】:

    • 感谢您的回答。是的。但不幸的是,调用ReverseMap() 会反转类型,对于调用.ForMember() 的第一个参数,我有一个没有NumberPropertyString 属性的BaseClass 类型。这就是我问“不复制地图”的方式。
    • @Lorenzo 好吧。似乎还有一个ForSourceMember 可用于在映射中选择源成员而不是目标成员。请注意,由于我现在没有安装 Automapper 的项目,因此我无法检查这是否有效。如果不是,我会帮大家一个忙并删除这个答案。
    • 没问题。让我试试。这对我来说更有意义。没意识到ForSourceMember的存在@
    • 是的,它有效。配置应在抽象类和继承类中进行。我已相应地编辑了您的答案。谢谢!
    • 干杯。两个地图都需要映射配置,这有点令人惊讶。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多