使用自动映射器而不会发生映射错误`缺少类型映射配置或不支持的映射`

时间:2019-12-26 12:25:28

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

我在.net core 3.1项目中使用AutoMapper.Extensions.Microsoft.DependencyInjection Nuget软件包。我的控制台应用程序代码如下(可以通过复制粘贴运行并安装AutoMapper.Extensions.Microsoft.DependencyInjection程序包以重现错误)。

我没有写任何映射。我仅将Automapper用于以下代码的克隆对象。 当我使用6.1.0软件包时,一切正常运行。但是当我升级6.1.1或7.0.0时,它给了我错误

Missing type map configuration or unsupported mapping. Mapping types: Foo -> FooDto AutomapperProject.Foo -> AutomapperProject.FooDto

这可能是什么原因?

using AutoMapper;

namespace AutomapperProject
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var foo = new Foo { Id = 1, Name = "Foo" };
            var dto = MapperHelper.MapFrom<FooDto>(foo);
        }
    }

    public static class AutomapperExtensions
    {
        private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr)
        {
            foreach (string propName in map.GetUnmappedPropertyNames())
            {
                var srcPropInfo = map.SourceType.GetProperty(propName);

                if (srcPropInfo != null)
                    expr.ForSourceMember(propName, opt => opt.DoNotValidate());

                var destPropInfo = map.DestinationType.GetProperty(propName);

                if (destPropInfo != null)
                    expr.ForMember(propName, opt => opt.Ignore());
            }
        }

        public static void IgnoreUnmapped(this IProfileExpression profile)
        {
            profile.ForAllMaps(IgnoreUnmappedProperties);
        }
    }

    public static class MapperHelper
    {
      private static IMapper Mapper()
      {
        var mapperConfig = new MapperConfiguration(configuration=>{configuration.IgnoreUnmapped();});    
        return mapperConfig.CreateMapper();
      }

      public static T MapFrom<T>(object entity)
      {
          return Mapper().Map<T>(entity);
      }
    }

    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class FooDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Unmapped { get; set; }
    }
}

2 个答案:

答案 0 :(得分:2)

版本7.0.0中的T软件包要求(至少)版本9.0.0中的AutoMapper.Extensions.Microsoft.DependencyInjection软件包。版本6.1.0的AutoMapper软件包要求(至少)版本8.1.0的AutoMapper.Extensions.Microsoft.DependencyInjection软件包。

9.0 Upgrade Guide所述,AutoMapper从8.0更改为9.0有一个重要更改,该更改会影响您的代码:

  

AutoMapper不再自动创建地图(CreateMissingTypeMaps和约定)

     

您将需要手动或使用反射来显式配置地图。还请考虑属性映射。

因此,对于新的AutoMapper 9.0.0,必须显式定义映射。

答案 1 :(得分:0)

如果使用Automapper软件包9.0.0或更高版本,则需要显式配置映射。正如@Progman所说。

我解决了将AutoMapper降级到8.0.0并将AutoMapper.Extensions.Microsoft.DependencyInjection降级到6.0.0版本的问题