Automapper 映射嵌套不同的对象属性

Automapper map nested different object properties

我有以下 Company 及其嵌套对象 CompanyEmployee:

public class Company
{ 
    public string Id { get; set; }
    public string LogoPath { get; set; }
    public string RammeId { get; set; }
    public List<CompanyEmployee> Employees { get; set; }
}

public class CompanyEmployee
{
    public string Id { get; set; }
    [ForeignKey("Company")]
    public string CompanyId { get; set; }
    public Company Company { get; set; }
    public string EmployeeId { get; set; }
}

现在我想将实体映射到定义为以下对象的 Dtos CompanyDto 及其嵌套对象 EmployeeDto:

public class CompanyDto
{
    [Required]
    public string Id { get; set; }
    [Required]
    public string Name { get; set; }
    public string LogoPath { get; set; }
    public string RammeId { get; set; }
    public IFormFile FormFile { get; set; }
    public List<EmployeeDto> Employees { get; set; }
}   

public class EmployeeDto
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public List<RoleDto> Roles { get; set; }
} 

我的问题是 CompanyEmployeeEmployeeDto 的映射。

我如何创建一个可以将 属性 EmployeeId 映射到 EmployeeDtoId 属性 的地图?

目前,我有以下地图:

    CreateMap<EmployeeDto, CompanyEmployee>(MemberList.Destination)
        .ForMember(emp => emp.EmployeeId, opt => opt.MapFrom(ce => ce.Id));

    CreateMap<CompanyDto, Company>(MemberList.Destination)
        .ForMember(c => c.Employees.Select(e => e.CompanyId), opt => opt.MapFrom(cd => cd.Id));

    CreateMap<Company, CompanyDto>(MemberList.Destination)
        .ForMember(c => c.Id, opt => opt.MapFrom(cd => cd.Employees.First().CompanyId));

只需创建Profile,所有具有相同名称的属性将自动映射。但是,不具有相同名称的属性,它们应该具有自定义映射:

public class FromModelToDto : Profile
{
    public FromModelToDto ()
    {
        CreateMap<CompanyEmployee, EmployeeDto>()
            .ForMember(dest.Id, opts => opts.MapFrom(model => model.EmployeeId))
    }
}

更新:

如果你想从 Dto 映射到模型,那么你应该创建另一个映射 class:

public class FromDtoToModel : Profile
{
    public FromDtoToModel ()
    {
        CreateMap<EmployeeDto, CompanyEmployee>()
            .ForMember(dest.EmployeeId, opts => opts.MapFrom(model => model.Id))
    }
}

You can read more about Automapper here.

您想创建一个 AutoMapper 配置文件来配置每个 属性 映射。 创建继承自 Profile 的 类 并将配置放在构造函数中。

例如:

public class EmployeeProfile : Profile
    {
        //Constructor
        public EmployeeProfile()
        {
            //Mapping properties from CompanyEmployee to EmployeeDto
            CreateMap<CompanyEmployee, EmployeeDto>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.EmployeeId));

            //Mapping properties from EmployeeDto to CompanyEmployee 
            CreateMap<EmployeeDto, CompanyEmployee>()
            .ForMember(dest => dest.EmployeeId, opt => opt.MapFrom(src => src.Id));
        }
    }
    public class CompanyProfile : Profile
    {
        //Constructor
        public CompanyProfile()
        {
            //Mapping properties from Company to CompanyDto
            CreateMap<Company, CompanyDto>()
            .ForMember(dest => dest.Employees, opt => opt.MapFrom(src => src.Employees));

            //Mapping properties from CompanyDto to Company 
            CreateMap<CompanyDto, Company>()
            .ForMember(dest => dest.Employees, opt => opt.MapFrom(src => src.Employees))
            //Setting CompanyId
            .AfterMap((src, dest) => {
                foreach (var employee in dest.Employees)
                {
                    employee.CompanyId = dest.Id;
                }
            });
        }
    }

AutoMapper Profile Configuration Documentation