2016-10-31 128 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