2 votes

Utilisation d'Automapper sans erreur de mappage : "Configuration de mappage de type manquante ou mappage non pris en charge".

J'utilise AutoMapper.Extensions.Microsoft.DependencyInjection Nuget dans mon projet .net core 3.1. Le code de mon application console est le suivant ( peut être exécuté par copier-coller et installer le paquet AutoMapper.Extensions.Microsoft.DependencyInjection pour reproduire l'erreur. ).

Je n'écris aucune cartographie. J'utilise l'Automapper uniquement pour les objets clonés comme dans le code ci-dessous. Lorsque j'utilise le paquet 6.1.0, tout fonctionne parfaitement. . Mais lorsque je mets à jour 6.1.1 ou 7.0.0, j'obtiens une erreur.

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

Quelle peut en être la raison ?

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

7voto

Progman Points 2244

El AutoMapper.Extensions.Microsoft.DependencyInjection dans la version 7.0.0 nécessite l'option AutoMapper dans (au moins) la version 9.0.0. Le paquet AutoMapper.Extensions.Microsoft.DependencyInjection dans la version 6.1.0 nécessite l'option AutoMapper dans (au moins) la version 8.1.0.

Le passage d'AutoMapper de la version 8.0 à la version 9.0 comporte un changement important qui a une incidence sur votre code, tel qu'il est écrit dans l'élément suivant Guide de mise à niveau 9.0 :

AutoMapper ne crée plus de cartes automatiquement (CreateMissingTypeMaps et conventions)

Vous devrez configurer explicitement les cartes, manuellement ou en utilisant la réflexion. Pensez également au mappage d'attributs.

Avec le nouvel AutoMapper 9.0.0, vous devez donc définir le mappage de manière explicite.

0voto

Si vous utilisez le package Automapper 9.0.0 ou supérieur, vous devrez configurer explicitement les cartes. Comme l'a dit @Progman.

J'ai résolu ce problème en rétrogradant AutoMapper à la version 8.0.0 et AutoMapper.Extensions.Microsoft.DependencyInjection à la version 6.0.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X