我有一个视图模型,例如
public class RootViewModel
{
public CreateCompanyViewModel Company { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
public CreateUserTypeViewModel UserType { get; set; }
}
而CreateCompanyViewModel
和CreateUserTypeViewModel
就像
public class CreateCompanyViewModel
{
public string CompanyName { get; set; }
}
public class CreateUserTypeViewModel
{
public string UserTypeName { get; set; }
}
我希望将此RootVM展平为多个DTO。我所拥有的上述RootVM的3个DTO就像
public class UserDTO
{
public string Name { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}
public class CompanyDTO
{
public string CompanyName { get; set; }
}
public class UserTypeDTO
{
public string UserTypeName { get; set; }
}
注意:请注意CompanyDTO
和UserTypeDTO
不是RootVM的嵌套对象({1}}。
当我使用AutoMapper进行映射时RootVM属性被映射到UserDTO
,但UserDTO
和CompanyDTO
按预期为空。
我尝试使用UserTypeDTO
函数使用ForMember
和MapFrom
方法映射它们,但它们都显示错误
成员的自定义配置仅支持顶级 个人成员。
更新 下面是我的映射代码
ResolveUsing
我正在使用 AutoMapper 5.2.0
更新 - 修复: 我发现的是,我必须手动使用.ForMember表示所有属性,否则自动约定工作,我需要使用https://github.com/AutoMapper/AutoMapper/wiki/Flattening或https://arnabroychowdhurypersonal.wordpress.com/2014/03/08/flattening-object-with-automapper/。
这是让它发挥作用的唯一方法。
希望我可以CreateMap<RootViewModel, CompanyDTO>();
CreateMap<RootViewModel, UserDTO>();
CreateMap<RootViewModel, UserTypeDTO>();
CreateMap<CreateCompanyViewModel, CompanyDTO>();
CreateMap<CreateUserTypeViewModel, UserTypeDTO>();
,并且它会映射.ForMember(d => d, s => s.MapFrom(x => x.Company))
中的所有属性。这本来非常方便,但AutoMapper并不支持这一点。
答案 0 :(得分:2)
尝试以下
CreateMap<CreateCompanyViewModel, CompanyDTO>();
CreateMap<CreateUserTypeViewModel, UserTypeDTO>();
CreateMap<RootViewModel, CompanyDTO>()
.ForMember(dest => dest.CompanyName, opt => opt.MapFrom(src => src.Company.CompanyName));
CreateMap < RootViewModel, UserTypeDTO()
.ForMember(dest => dest.UserTypeName, opt => opt.MapFrom(src => src.UserType.UserTypeName));
CreateMap<RootViewModel, UserDTO>();