我正在尝试将AutoMapper用于通常情况下的Dto->实体。但是Dto的属性之一应该映射到我实体的子级。
我的雇员DTO的属性类型为int,JobTitleId。我的雇员实体有一个子实体JobTitle,它具有id属性。这是我要映射到的地方。因此,总结起来就像:
EmployeeDto.JobTitleId ---> Employee.JobTitle.Id
唯一对我有用的方法是添加一个自定义Automapper解析器,但是当我需要在许多不同但相似的情况下进行此操作时,它太讨厌了。
class EmployeeDto
{
int JobTitleId;
}
Class Employee
{
JobTitle jobTitle;
}
Class JobTitle
{
int Id;
}
我想要类似的东西:
public class EmployeeMapperProfiles : Profile
{
public EmployeeMapperProfiles()
{
CreateMap<EmployeeDto, Employee>()
.ForMember(dest => dest.JobTitle.Id,
opt => opt.MapFrom(src => src.JobTitleId));
}
}
但是,我使用这种方法的结果是:
System.ArgumentException: 'Expression 'dest => dest.JobTitle.Id' must resolve to top-level member and not any child object's properties. You can use ForPath, a custom resolver on the child type or the AfterMap option instead. (Parameter 'lambdaExpression')'.
但是AfterMap和自定义解析器方法不是我想要的。因此它必须是ForPath,尽管无法正常工作。
异常消息告诉您不能为子对象属性指定自定义映射规则,如下所示:
CreateMap<EmployeeDto, Employee>()
.ForMember(
employee => employee.JobTitle.Id,
options => options.MapFrom(employeeDto => employeeDto.JobTitleId));
这是因为仅支持顶级成员,对于更深层的映射,您应该使用值解析器,类型转换器,显式路径配置或类型之间的其他映射之类的工具。
要为Id
的Employee
指定源属性,您应该使用已经确定的路径配置。这非常简单,就像这样:
CreateMap<EmployeeDto, Employee>()
.ForPath(
employee => employee.JobTitle.Id,
options => options.MapFrom(employeeDto => employeeDto.JobTitleId));