【问题标题】:Automapper: second mapping throws missing typemapAutomapper:第二个映射抛出丢失的类型映射
【发布时间】:2017-09-21 10:55:28
【问题描述】:

在初始化 Automapper 并调用 Mapper.Map 后,typeMap 为 null,第二次调用 Mapper.Map 抛出异常“缺少类型映射”。

我已经初始化了映射:

AutoMapper.Mapper.Initialize(cfg =>
                { 
                    cfg.CreateMap<Role, AppRole>();
                });
                Mapper.AssertConfigurationIsValid();

然后调用后:

var roleTest = Mapper.Map<Role, AppRole>(role);
var mapped = Mapper.Configuration.FindTypeMapFor(typeof(Role), typeof(AppRole)); // here mapped is null
var roleTestSecond = Mapper.Map<Role, AppRole>(role); // exception thrown "Missing type map"

您知道为什么第二个映射不起作用并且缺少类型映射吗?我错过了什么吗?

【问题讨论】:

  • 这是您的实际代码吗?您在此处发布的内容不会引发该异常。
  • 它抛出。它是我的实际代码。我问是因为我知道它不应该抛出异常
  • 我在这里尝试时不会抛出...
  • 所以也许它在代码的其他部分。我会继续寻找
  • 这些类是否包含嵌套的复杂类型?你得到这个缺失的类型映射到底是什么类型的?

标签: c# automapper


【解决方案1】:

我在使用静态 Mapper 时遇到了同样的问题。我的解决方案是制作像 ConveriosnExtensions 这样的静态类。见下文:

      public static class DataConversionsExtensions
    {
        private static readonly IMapper Mapper;

        static DataConversionsExtensions()
        {
            var configuration = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Field, DbField>();
                cfg.CreateMap<DbField, Field>();  });

            Mapper = new Mapper(configuration);
        }

        public static Field ToField(this DbField field)
        {
            return Mapper.Map<Field>(field);
        }

        public static DbField ToDbField(this Field field)
        {
            return Mapper.Map<DbField>(field);
        }
}

这样您就可以确定您当前使用的是哪种配置,并且可以非常轻松地使用转换:

var field = dbfield.ToField();

这也很好地封装了整个过程,因此不再需要复制粘贴代码

编辑:当然,多年后我不会使用静态类,而是使用 DI 容器,并在需要时注入 IMapper

【讨论】:

  • 我会试试这个
【解决方案2】:

据我了解,您需要密封您的配置,以便 FindTypeMapFor 返回任何内容。

尝试在您的自动映射器初始化中添加对 seal 的调用。

AutoMapper.Mapper.Initialize(cfg =>
            { 
                cfg.CreateMap<Role, AppRole>();
            });
            Mapper.Configuration.Seal();
            Mapper.AssertConfigurationIsValid();

【讨论】:

  • 据我所知没有。印章没有区别。
  • 我在 automapper 单元测试中看到此评论后建议这样做: // 如果密封 _typeMapCache 已填充并且应该能够解析类型映射 // 如果没有密封 _typeMapCache 为空并且应该返回 null 我可以很好地脱离了上下文。看看它是否对 OP 有帮助。
  • 即使这很重要,也只会使 FindTypeMapFor 方法返回 null。问题是引发异常的下一行。
猜你喜欢
  • 2016-01-06
  • 2016-08-11
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
相关资源
最近更新 更多