AutoMapper无法映射嵌套的复杂类型

时间:2018-08-18 11:22:45

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

我有以下配置。

public class AutoMapperProfile: Profile
    {
        public AutoMapperProfile()
        {
           CreateMap<DTO, Model>();
           CreateMap<InnerDTO, NavigationPropertyModel>();
        }
   }

在我的代码中,我有

Model.NavigationProperty = mapper.Map(DTO.InnerDTO, Model.NavigationProperty);

似乎工作得很好,但

Model = mapper.Map(DTO, Model);

没有。 (InnerDTO未映射)

PS:映射器是自动映射器的实例。

我想坚持使用第二种方法,因为DTO不仅可以具有InnerDTO的更多属性。

我尝试使用Mapper.AssertConfigurationIsValid();,但遇到了异常

  

System.InvalidOperationException:'映射器未初始化。呼叫   使用适当的配置进行初始化。如果您尝试使用   通过容器或其他方式的映射器实例,请确保您执行   没有对静态Mapper.Map方法的任何调用,如果您   使用ProjectTo或UseAsDataSource扩展方法,请确保您   传入适当的IConfigurationProvider实例。”

2 个答案:

答案 0 :(得分:-1)

可能丢失的是在AutoMapperProfile中添加Startup.cs类。

public void ConfigureServices(IServiceCollection services) {
    // Automapper conf
    var config = new MapperConfiguration(configure => {
        // Add your profile class here
        configure.AddProfile(new AutoMapperProfile());
    });
    // Creating instance of automapper for dependency injection
    var mapper = config.CreateMapper();
    services.AddSingleton(mapper);

    // More complex code here...
}

随后,通过依赖项注入,您将使用自动映射器。在我的特定情况下,我通过以下方式进行操作:

[Route("api/Permiso")]
[ApiController]
public class PermisoController : ControllerBase {
    private readonly IMapper _mapper;
    private readonly IBusinessLogicHelper _blh;

    public PermisoController(BusinessLogicHelper blh, IMapper mapper) {
        _blh = blh;
        _mapper = mapper;
    }

    [HttpGet]
    public IActionResult Get() {
        try {
            // Get raw data from entities
            var resultsRaw = _blh.GetDataRaw();
            if (resultsRaw == null) {
                return NotFound();
            }
            // Mapping data from entity to DTO
            var resultsDTO = _mapper.Map<ReturnDataDTO>(resultsRaw);
            return Ok(resultsDTO);
        } catch (Exception ex) {
            // Custom ObjectResult for InternalServerError
            return new InternalServerErrorObjectResult(ex.Message);
        }
    }
}    

答案 1 :(得分:-1)

尝试为CreateMap<DTO, Model>();配置子属性。

        public AutoMapperProfile()
    {
        CreateMap<DTO, Model>()
            .ForMember(dest => dest.NavigationPropertyModel, opt => opt.MapFrom(src => src.InnerDTO));
        CreateMap<InnerDTO, NavigationPropertyModel>();
    }