简体   繁体   中英

How can i map a child object with AutoMapper?

I am not sure if i am over thinking this or not, but i cannot sus this out.

I have a parent object here called Template

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

Here is my Scoring object which is a child property of Template

public enum MyEnum : short 
{
    Basic = 0
}

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

I have a TemplateModel defined, like so, which i want to convert to

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

In my AutoMapper Profile, i have set this up like so, to covert Template to 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();
        }
    }
}

How can i convert TemplateModel back into Template?

If i add the following, i get an exception, because dest.Scoring.Type is not a root property.

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));

Any help much appreciated. In this case a Template must always have a Scoring object, but in other cases i have optional properties. If someone could help me with both that would be great.

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));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM