2016-08-10 11 views
1

나는이 생각을 끝내야할지 모르겠다. 그러나 나는 이것을 밖으로 나눌 수 없다.어떻게 AutoMapper를 사용하여 하위 개체를 매핑 할 수 있습니까?

나는 여기에 부모 개체가 서식 여기

public Template() 
{ 
    public long Id { get; set; } 
    public Scoring SubProperty { get; set; } 
} 

라는 가지고있다 템플릿의 자식 속성입니다 내 점수 개체

public enum MyEnum : short 
{ 
    Basic = 0 
} 

public Scoring() 
{ 
    public MyEnum Type { get; set; } 
    public string Text { get; set; } 
} 

나는 내가 원하는과 같이, 정의 TemplateModel을 가지고

public TemplateModel() 
{ 
    public long Id { get; set; } 
    public string Type { get; set; } 
    public string Text { get; set; } 
} 

내 오토 맵퍼 프로파일에서 나는 이것을 다음과 같이 설정했습니다. cov 템플릿을 TemplateModel로 변환합니다.

public class TemplateProfile : Profile 
{ 
    protected override void Configure() 
    { 
     // converters 
     this.CreateMap<TemplateType, string>().ConvertUsing(new TemplateTypeConverter()); 

     // models 
     this.CreateMap<Template, TemplateModel>() 
      .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Scoring.Type)) 
      .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Scoring.Text)); 

    } 

    /// <summary> 
    /// Convert TemplateType to string 
    /// </summary> 
    private class TemplateTypeConverter : ITypeConverter<TemplateType, string> 
    { 
     public string Convert(ResolutionContext context) 
     { 
      return context.SourceValue.ToString().ToLower(); 
     } 
    } 
} 

어떻게하면 TemplateModel을 다시 템플릿으로 변환 할 수 있습니까?

dest.Scoring.Type은 루트 속성이 아니기 때문에 다음을 추가하면 예외가 발생합니다.

this.CreateMap<TemplateModel, Template>() 
    .ForMember(dest => dest.Scoring.Type, opt => opt.MapFrom(src => src.Type)) 
    .ForMember(dest => dest.Scoring.Text, opt => opt.MapFrom(src => src.Text)); 

많은 도움을 주셨습니다. 이 경우 Template에는 항상 Scoring 개체가 있어야하지만 다른 경우에는 선택적 속성이 있습니다. 누군가가 두 가지로 나를 도울 수 있다면 그것은 위대 할 것입니다.

+0

나는 이것을 위해 AM을 사용하지 않을 것이다. 간단하고 직관적 인 매핑 작업에 사용하십시오. –

답변

5
this.CreateMap<TemplateModel, Template>() 
    .ForMember(dest => dest.SubProperty, opt => opt.MapFrom(src => src)); 

this.CreateMap<TemplateModel, Scoring>() 
    .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type)) 
    .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Text)); 
+0

고맙습니다. 분명히'src => src' 부분이 없습니다. 완벽하게 작동 – Gillardo

+0

당신은 @ user2736022을 환영합니다. –