2015-04-04 177 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