Карта Automapper вложила различные свойства объекта - PullRequest
1 голос
/ 12 февраля 2020

У меня есть следующий 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; }
} 

Моя проблема - отображение CompanyEmployee на EmployeeDto.

Как создать карту, которая может взять свойство EmployeeId и сопоставить его со свойством Id EmployeeDto?

В настоящее время у меня есть следующие карты:

    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));

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вы хотите создать профиль 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

1 голос
/ 12 февраля 2020

Просто создайте Profile и все свойства с одинаковыми именами будут сопоставлены автоматически. Однако свойства, которые не имеют одинаковых имен, должны иметь настраиваемое сопоставление:

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

ОБНОВЛЕНИЕ:

Если вы хотите отобразить из Dto в Model, вам следует создать другое сопоставление класс:

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

Подробнее о Automapper можно прочитать здесь.

...