zoukankan      html  css  js  c++  java
  • 升级AutoMapper后遇到的“Missing map”与“Missing type map configuration”问题

    前几天发现 AutoMapper 3.3 的一个性能问题(详见:遭遇AutoMapper性能问题:映射200条数据比100条慢了近千倍),于是将 AutoMapper 升级至最新的 5.1.1 看是否也存在这个性能问题。

    升级中想当然地将之前的map配置代码:

    Mapper.CreateMap<AEntity, ADto>();
    Mapper.CreateMap<BEntity, BDto>();

    改为:

    Mapper.Initialize(cfg => cfg.CreateMap<AEntity, ADto>());
    Mapper.Initialize(cfg => cfg.CreateMap<BEntity, BDto>());

    但是代码运行时在执行 Mapper.Map() 时出现下面的错误:

    Missing type map configuration or unsupported mapping

    在执行 ProjectTo() 时出现下面的错误:

    System.InvalidOperationException: Missing map from AEntity to ADto. 
    Create using Mapper.CreateMap<AEntity, ADto>.
    在 AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression...

    当时百思不得其解,折腾了一段时间无果,就暂时放在一边。

    今天在博问上发现有人遇到了同样的问题——求解AutoMapper映射类发生错误求解,于是解决这个问题的兴趣被激发,又开始折腾。

    在折腾的过程中发现,如果不用 Mapper.Initialize() 这种静态的配置方式,改用下面的实例配置方式,就不会出现这个问题。

    var config = new MapperConfiguration(cfg => cfg.CreateMap<A, B>());
    var mapper = config.CreateMapper();
    mapper.Map<List<B>>(list);

    Mapper.Initialize() 理所当然地成了最大的嫌疑对象,于是从 GitHub 上签出 AutoMapper 的源代码一看 Mapper.Initialize() 的实现,恍然大悟。

    public static void Initialize(Action<IMapperConfigurationExpression> config)
    {
        Configuration = new MapperConfiguration(config);
        Instance = new Mapper(Configuration);
    }

    原来每次调用 Mapper.Initialize() 都会创建新的 Mapper 实例,也就是多次调用 Mapper.Initialize() 只有最后一次生效。

    下面的配置代码中生效的只是第2行(BEntity到BDto的map),第1行(AEntity到ADto的map)没生效,从而出现前面所说的错误。

    Mapper.Initialize(cfg => cfg.CreateMap<AEntity, ADto>());
    Mapper.Initialize(cfg => cfg.CreateMap<BEntity, BDto>());

    知道了原因,解决起来就手到擒来,改为下面的代码即可。

    var cfg = new MapperConfigurationExpression();
    cfg.CreateMap<AEntity, ADto>();
    cfg.CreateMap<BEntity, BDto>();
    Mapper.Initialize(cfg);

    解决这个问题后,成功完成了 AutoMapper 的升级,然后验证了 AutoMapper 3.3 的性能问题在 AutoMapper 5.1.1 中不存在。

  • 相关阅读:
    protobuf 使用
    rsync实现Linux与windows增量更新数据
    单例模式-通用写法1
    cxf RESTful service client
    IDEAspringboot项目自动生成junit测试
    Centos8配置网络NM
    Oracle终止正在执行中的存储过程
    Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT.
    shell中判断变量是否存在某个集合中
    redis-ha部署
  • 原文地址:https://www.cnblogs.com/dudu/p/5875579.html
Copyright © 2011-2022 走看看