2015-04-04 142 views
1

我有以下的抽象类AutoMapper继承错误

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()调用而发生错误。如何设置反向贴图来忽略成员而不复制贴图?

回答

1

您需要使用

.ReverseMap() 
    .ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore()); 

看来,您的具体映射的配置,你应该配置在底座都和混凝土以及忽略反向映射的NumberPropertyAsString

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

感谢您的回答。是。但不幸的是,调用'ReverseMap()'会将类型和调用的第一个参数反转为'.ForMember()'我有一个'BaseClass'类型,它没有'NumberPropertyString'属性。这就是我问“没有复制地图”的方式。 – Lorenzo 2015-04-04 23:12:31

+0

@洛伦佐啊好的。看起来还有一个'ForSourceMember',可以用来在映射中选择源的成员而不是目标。请注意,由于我目前没有安装Automapper的项目,因此无法检查这是否可行。如果没有,我会帮大家一个忙,并删除这个答案。 – Alex 2015-04-04 23:23:27

+0

没问题。让我尝试。这对我更有意义。没有意识到'ForSourceMember'的存在 – Lorenzo 2015-04-04 23:25:32