2012-09-18 26 views
5

Tôi đang gặp sự cố với AutoMapper 2.1.267.0 khi làm việc với các đối tượng có chứa các bộ sưu tập của các lớp dẫn xuất. tôi đã cô lập vấn đề của tôi trong một kịch bản đơn giản với các loại sau đây:AutoMapper không hoạt động với bộ sưu tập các lớp dẫn xuất

public class ClassABase 
{ 
    public string Name { get; set; } 
} 

public class ClassA : ClassABase 
{ 
    public string Description { get; set; } 
} 

public class ClassBBase 
{ 
    public string Title { get; set; } 
} 

public class ClassB : ClassBBase 
{ 
    public string Text { get; set; } 
} 

public class ContainerA 
{ 
    public IList<ClassA> ClassAList { get; set; } 
    public ClassA ClassA { get; set; } 
} 

public class ContainerB 
{ 
    public IList<ClassB> ClassBList { get; set; } 
    public ClassB ClassB { get; set; } 
} 

và những ánh xạ

public class ClassABaseToClassBBase : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassABase, ClassBBase>() 
      .Include<ClassA, ClassB>() 
      .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Name)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ClassAToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassA, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Description)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ContainerAToContainerB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ContainerA, ContainerB>() 
      .ForMember(dest => dest.ClassBList, 
         opt => opt.MapFrom(src => Mapper.Map<IList<ClassA>, IList<ClassB>>(src.ClassAList))) 
      .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

    } 
} 

Đây là khởi

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

và một sơ đồ tóm tắt tất cả mọi thứ (Mũi tên màu đỏ thể hiện ánh xạ AutoMapper)

enter image description here

Tôi đã ánh xạ bản sao ContainerA lên ContainerB. Kịch bản đầu tiên này hoạt động đúng. Các đối tượng đích được đầy đủ đầy như thể hiện trong hình ảnh dưới đây:

enter image description here


Nhưng nếu tôi thêm bản đồ này

public class ClassBBaseToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassBBase, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.Ignore()); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ClassBBaseToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

enter image description here

kết quả là

enter image description here

Thuộc tính "Văn bản" của tất cả các phần tử của bộ sưu tập trở thành rỗng. Như bạn có thể thấy trong hình ảnh, thuộc tính "Văn bản" của đối tượng containerB.ClassB vẫn được ánh xạ chính xác. Điều này chỉ xảy ra với các bộ sưu tập. Tôi không biết chuyện gì đang xảy ra. Bất kì manh mối nào?

Cảm ơn

+0

gì kết quả mà bạn đang mong đợi? – Cybermaxs

+0

Tôi đã mong đợi tất cả các phần tử từ containerB.ClassBList được điền đầy đủ, thay vì có các thuộc tính rỗng. – peflorencio

Trả lời

1

Hi,

Cố gắng thay đổi ánh xạ giữa container theo cách này:

public class ContainerAToContainerB : Profile 
    { 
     protected override void Configure() 
     { 
      CreateMap<ContainerA, ContainerB>() 
       .ForMember(dest => dest.ClassBList,opt=>opt.MapFrom(src=>src.ClassAList)) 
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

     } 
} 
Các vấn đề liên quan