【问题标题】:AutoMapper not mapping nested complex typeAutoMapper 不映射嵌套的复杂类型
【发布时间】:2018-08-18 11:22:45
【问题描述】:

我有以下配置。

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:mapper 是 automapper 的一个实例。

我想坚持第二种方法,因为 DTO 可以拥有比 InnerDTO 更多的属性。

我尝试使用Mapper.AssertConfigurationIsValid();,但出现异常

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

【问题讨论】:

  • 也许我把你的问题搞错了,但是automapper,只要你定义了你拥有的所有属性的映射,这可能是其他属性,automapper 知道如何正确映射它们.无需手动调用Model.NavigationProperty = mapper.Map()
  • -1 被否决,因为您没有提供How to create a Minimal, Complete, and Verifiable example。您没有提供映射器是如何实例化的,也没有提供模型的定义。
  • @ErikPhilips 我可以用一般的ModelNavigationProperty 重现这种行为。等待操作检查我的答案是否有效。

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


【解决方案1】:

尝试为CreateMap&lt;DTO, Model&gt;(); 配置子属性。

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

【讨论】:

    【解决方案2】:

    您可能缺少的是在Startup.cs 中添加您的AutoMapperProfile 类。

    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...
    }
    

    随后,通过依赖注入,您可以使用 automapper。在我的特殊情况下,我按以下方式进行:

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

    【讨论】:

    • 为什么对问题和答案投反对票?我需要一个解释:|
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多