.net 如何映射嵌套类型

.net 如何映射嵌套类型,.net,automapper,.net,Automapper,我在做三级映射时遇到问题。课程如下: public class Company { public Contact MainContact { get; private set; } } public class Contact { public PersonsName ContactName { get; private set; } } public class PersonsName { public String FirstName { get; priv

我在做三级映射时遇到问题。课程如下:

public class Company {
    public Contact MainContact { get; private set; }
}


public class Contact {
    public PersonsName ContactName { get; private set; }
}

public  class PersonsName  {
    public String FirstName { get; private set; }
    public String LastName { get; private set; }

}

public class CreateCompanyViewModel {
    [Required]
    [MaxLength(25, ErrorMessage = "Only 25 characters are allowed.")]
    [Display(Name = "First Name")]
    public String FirstName { get; set; }

    [Required]
    [MaxLength(25, ErrorMessage = "Only 25 characters are allowed.")]
    [Display(Name = "Last Name")]
    public String LastName { get; set; }
}
我尝试了以下方法,但没有成功:

Mapper.CreateMap<CreateCompanyViewModel, PersonsName>()
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName))
    .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName));

Mapper.CreateMap<Contact, PersonsName>()
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.ContactName.FirstName))
    .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.ContactName.LastName));

Mapper.CreateMap<CreateCompanyViewModel, Company>()
    .ForMember(dest => dest.MainContact.ContactName.FirstName, opt => opt.MapFrom(src => src.FirstName))
    .ForMember(dest => dest.MainContact.ContactName.FirstName, opt => opt.MapFrom(src => src.LastName));
Mapper.CreateMap()
.ForMember(dest=>dest.FirstName,opt=>opt.MapFrom(src=>src.FirstName))
.ForMember(dest=>dest.LastName,opt=>opt.MapFrom(src=>src.LastName));
Mapper.CreateMap()
.FormMember(dest=>dest.FirstName,opt=>opt.MapFrom(src=>src.ContactName.FirstName))
.ForMember(dest=>dest.LastName,opt=>opt.MapFrom(src=>src.ContactName.LastName));
Mapper.CreateMap()
.ForMember(dest=>dest.MainContact.ContactName.FirstName,opt=>opt.MapFrom(src=>src.FirstName))
.ForMember(dest=>dest.MainContact.ContactName.FirstName,opt=>opt.MapFrom(src=>src.LastName));
我收到的错误消息是:

表达式'dest=>dest.MainContact.ContactName.FirstName'必须解析为顶级成员,而不是任何子对象的属性。在子类型或AfterMap选项上使用自定义解析器。
参数名称:lambdaExpression

您可以使用以下配置:

/* Innermost mapping */
Mapper.CreateMap<CreateCompanyViewModel, PersonsName>();
// You don't need the individual member mappings since the names match.

/* Second-level */
Mapper.CreateMap<CreateCompanyViewModel, Contact>()
    .ForMember(dest => dest.ContactName, opt => opt.MapFrom(src => src));

/* Top level */
Mapper.CreateMap<CreateCompanyViewModel, Company>()
    .ForMember(dest => dest.MainContact, opt => opt.MapFrom(src => src));
用法:

Mapper.CreateMap<CreateCompanyViewModel, Contact>()
    .ForMember(dest => dest.ContactName, opt => opt.MapFromSelf());

Mapper.CreateMap<CreateCompanyViewModel, Company>()
    .ForMember(dest => dest.MainContact, opt => opt.MapFromSelf());
Mapper.CreateMap()
.FormMember(dest=>dest.ContactName,opt=>opt.MapFromSelf());
Mapper.CreateMap()
.ForMember(dest=>dest.main联系人,opt=>opt.MapFromSelf());

标题可能重复这是一个误导,实际上这是一个关于映射到多个类的问题,所有这些类都在顶层。您能否显示
CreateCompanyViewModel
?添加了CreateCompanyViewModel,但不知何故忽略了oops。谢谢Andrew。周一晚些时候才有机会尝试,但看起来很有趣!干杯,安德鲁,施了魔法。有一种感觉,解决方案会很简单(也许不是那么明显:)
Mapper.CreateMap<CreateCompanyViewModel, Contact>()
    .ForMember(dest => dest.ContactName, opt => opt.MapFromSelf());

Mapper.CreateMap<CreateCompanyViewModel, Company>()
    .ForMember(dest => dest.MainContact, opt => opt.MapFromSelf());