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

时间:2020-02-12 08:34:40

标签: c# .net .net-core automapper

我有以下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; }
}

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

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并将其映射到Id的{​​{1}}属性的地图?

目前,我有以下地图:

EmployeeDto

2 个答案:

答案 0 :(得分:1)

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

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

更新:

如果要从Dto映射到模型,则应创建另一个映射类:

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.

答案 1 :(得分:1)

您要创建一个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

相关问题