简体   繁体   English

如何使用AutoMapper映射子对象?

[英]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 这是我的计分对象,它是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 我有一个这样定义的TemplateModel,我想将其转换为

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. 在我的AutoMapper配置文件中,我已经将其设置为将Template隐藏为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? 如何将TemplateModel转换回Template?

If i add the following, i get an exception, because dest.Scoring.Type is not a root property. 如果添加以下内容,则会出现异常,因为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));

Any help much appreciated. 任何帮助,不胜感激。 In this case a Template must always have a Scoring object, but in other cases i have optional properties. 在这种情况下, Template必须始终具有Scoring对象,但在其他情况下,我具有可选属性。 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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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