c# - 使用 Automapper 没有映射错误 `Missing type map configuration or unsupported mapping`

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

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

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

缺少类型映射配置或不支持的映射。 映射类型: 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; }
    }
}

最佳答案

7.0.0 版中的 AutoMapper.Extensions.Microsoft.DependencyInjection 包需要(至少)9.0.0 版中的 AutoMapper 包。 6.1.0 版中的 AutoMapper.Extensions.Microsoft.DependencyInjection 包需要(至少)8.1.0 版中的 AutoMapper 包。

AutoMapper 从 8.0 到 9.0 的变化有一个重要的变化,它会影响您的代码,如 9.0 Upgrade Guide 中所写:

AutoMapper no longer creates maps automatically (CreateMissingTypeMaps and conventions)

You will need to explicitly configure maps, manually or using reflection. Also consider attribute mapping.

因此,对于新的 AutoMapper 9.0.0,您必须明确定义映射。

关于c# - 使用 Automapper 没有映射错误 `Missing type map configuration or unsupported mapping`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488481/

相关文章:

c# - 用 ConstructUsing 替换 Mapping

c# - Automapper - 如何映射私有(private)支持字段

c# - unity3d如何改变实例化预制件的颜色

c# - NHibernate 3 Alpha - proxyfactory.factory_class?

c# - 使用 NLog 通过 WebService 记录自定义类

c# - 在 ASP.NET Core WebApplicationFactory 中覆盖 EF Core DbContext

c# - 如何禁用所有 WebApi 响应的缓存以避免 IE 使用(来自缓存)响应

c# - 在 .NET 中创建加密安全随机 GUID

asp.net-core - 如何控制 ASP.Net 核心集成测试中的日志级别

c# - Automapper 使用自定义映射展平多个复杂对象