【问题标题】:Mapping from primtive type property to child object从原始类型属性映射到子对象
【发布时间】:2019-11-07 10:45:28
【问题描述】:

我正在尝试将 AutoMapper 用于通常的场景 Dto -> Entity。但是 Dto 的属性之一应该映射到我的实体的孩子。

我的员工 DTO 有一个 int 类型的属性 JobTitleId。 我的员工实体有一个子实体 JobTitle,它的属性为 id。这是我要映射到的地方。所以总结起来会是这样的:

EmployeeDto.JobTitleId ---> Employee.JobTitle.Id

唯一对我有用的是添加一个自定义自动映射器解析器,但是当我需要为许多不同但相似的场景这样做时,它变得太讨厌了。

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,但不能让它工作。

【问题讨论】:

标签: c# .net-core automapper


【解决方案1】:

说明

异常消息告诉您不能为子对象属性指定自定义映射规则,如下所示:

CreateMap<EmployeeDto, Employee>()
    .ForMember(
        employee => employee.JobTitle.Id,
        options => options.MapFrom(employeeDto => employeeDto.JobTitleId));

这是因为只支持顶级成员,并且对于更深层次的映射,您应该使用值解析器、类型转换器、显式路径配置或类型之间的其他映射等工具。

解决方案

要为Employee 的Id 指定源属性,您应该使用您已经弄清楚的路径配置。这很简单,就像这样:

CreateMap<EmployeeDto, Employee>()
    .ForPath(
        employee => employee.JobTitle.Id,
        options => options.MapFrom(employeeDto => employeeDto.JobTitleId));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2021-07-04
    • 2021-04-30
    相关资源
    最近更新 更多