2016-10-31 127 views
1

你好,我不能讓我的映射工作繼承類。 想法是僅爲基礎對象和接口創建映射一次,並且當子類實現其自己的成員時,爲那些未在基類或intrface中定義的成員配置映射。Automapper 5.1.1繼承映射

讓我從示例代碼開始。

public class DtoClass { 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public string Field3 { get; set; } 
} 

public interface IField3 { 
    public string EntityField3 { get; set; } 
} 

public class BaseEntityClass { 
    public string EntityField1 { get; set; } 
} 

public class ChildEntityClass : BaseEntityClass, IField3 { 
    public string EntityField2 { get; set; } 
    public string EntityField3 { get; set; } 
} 


CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1)) 
    .Include<ChildEntityClass, DtoClass>(); 

CreateMap<IField3, DtoClass>() 
    .ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3)); 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2)); 

附加碼dosnt work of course。打電話時:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass); 

我只得到映射CreateMap<ChildEntityClass, DtoClass>().

任何想法如何實現基類的映射和接口只有一次中定義的成員? 是的,我想將所有類型ChildEntityClass,BaseEntityClass和IField3映射到DtoClass。

任何提示都歡迎優雅配置這種映射。

編輯:我是從子類中刪除unecssary IncludeBase爲清楚起見,但沒有兩者
的 - IncludeBase在子類 - 在基類 對我的作品包含。什麼會導致這樣的問題?

回答

0

因爲它經常發生的問題是我在示例代碼交付的範圍之外。

在我的初始化方法項目是隱藏的類似調用:

 foreach (string propName in map.GetUnmappedPropertyNames()) 
     { 
      expr.ForMember(propName, opt => opt.Ignore()); 
     } 

所以在子類中沒有映射所有列的基本類型調用映射時被自動忽略連。簡單但有問題。

上述代碼可能通過Mapper.Configuration.AssertConfigurationIsValid();

0

你不應該使用.IncludeBase AND .Include - 挑一個並堅持下去。我更喜歡.IncludeBase,因爲我認爲在子類中定義更合理。在你的情況下,你不能使用Include來引用IField3,因爲沒有隱式轉換。

下面的代碼工作使用IncludeBase

CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1)) 
    ; 

CreateMap<IField3, DtoClass>() 
    .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3)) 
    ; 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2)) 
    .IncludeBase<BaseEntityClass, DtoClass>() 
    .IncludeBase<IField3, DtoClass>() 
    ; 
+0

沒有它仍然不起作用,只有調用配置爲最後一次的映射,沒有來自基類的映射。包括在基類中都不適合我。 而另一個問題接口是什麼? 爲了清楚起見,我在示例代碼中刪除了IncludeBase <>。 – PabloPC

+0

確保使用Mapper.AssertConfigurationIsValid()測試您的配置文件。這可能會指出造成問題的原因。 – Richard

+0

使用您的示例代碼使用IncludeBase更新我的答案,它適用於我。 – Richard