web-dev-qa-db-fra.com

Auto Mapper membres non mappés ont été trouvés

Nous utilisons Automapper pour un projet et nous semblons avoir l'erreur suivante au hasard:

AutoMapper.AutoMapperConfigurationException: des membres non mappés ont été trouvés. Passez en revue les types et les membres ci-dessous. Ajouter une expression de mappage personnalisée, ignorer, ajouter un résolveur personnalisé ou modifier le type source/destination

Le code n'a pas été changé depuis des mois. Je reçois cette erreur, rafraîchissez-vous et l'erreur a disparu et la page fonctionne correctement. j'utilise

Mapper.AssertConfigurationIsValid();

je ne sais pas pourquoi il se plaint que les mappages ne sont pas bons, puis un rafraîchissement et tout va bien, est-ce que quelqu'un a déjà rencontré ce problème? Le débogage n’aide en rien, c’est aléatoire, il n’ya parfois aucune erreur, puis les autres jours, il apparaîtra quelque part sur le site, y reviendra et c’est correct. L'erreur apparaît également sur des pages aléatoires, pas la même page, pas le même mappage.

49
Paritosh

Introduction rapide: comme @mrTurkay répond ci-dessous, cela peut être résolu avec la configuration suivante:

cfg.ValidateInlineMaps = false;

Cependant, vous devez comprendre pourquoi le problème survient en premier lieu - alors n'hésitez pas à lire.

Ce problème survient lorsque vous essayez de mapper un objet pour lequel vous n'avez pas créé de configuration de mappage. Ce que vous devez garder à l'esprit, c'est qu'il ne doit pas nécessairement s'agir de l'objet spécifique que vous essayez de mapper; mais une de ses propriétés de navigation.

Disons par exemple que vous avez un Car.cs que vous voulez mapper sur un CarDTO.cs

Le Car.cs ressemble à ça:

public class Car
{
  public string Color { get; set; }

  public Engine Engine { get; set; }
}

Et votre DTO a le même aspect, mais a plutôt une référence au EngineDTO:

public class CarDTO
{
  public string Color { get; set; }

  public EngineDTO Engine { get; set; }
}

Vous avez configuré le mappage comme ceci:

    Mapper.CreateMap<DTO.CarDTO, Data.Model.Car>();
    Mapper.CreateMap<Data.Model.Car, DTO.CarDTO>();

    Mapper.CreateMap<DTO.EngineDTO, Data.Model.Engine>();
    Mapper.CreateMap<Data.Model.Engine, DTO.EngineDTO>();

Tout va bien, non? Cependant, dans votre EngineDTO, vous avez probablement une propriété de navigation comme, disons:

public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}

Donc, pendant que Automapper mappe de Engine à EngineDTO, il tente également de mapper le PartDTO, mais vous avez oublié de déclarer le mappage dans le fichier global.asax, vous obtenez l'erreur:

AutoMapper.AutoMapperConfigurationException: des membres non mappés ont été trouvés. Passez en revue les types et les membres ci-dessous. Ajouter une expression de mappage personnalisée, ignorer, ajouter un résolveur personnalisé ou modifier le type source/destination

Si vous ne souhaitez pas mapper certaines propriétés sur une classe, vous pouvez utiliser Ignorer:

Mapper.CreateMap<Engine, EngineDTO>()
    .ForMember(x => x.Parts, opt => opt.Ignore());

MODIFIER:

Pour une configuration AutoMapper plus robuste, je vous suggère d’utiliser des profils de mappage au lieu de déclarer le mappage directement dans Global.asax. Voici un exemple:

Profil:

public class CarProfile : Profile
{
    public CarProfile ()
    {
        CreateMap<Car, CarDTO>();
    }
}

Global.asax:

Mapper.Initialize(cfg =>
{
     cfg.AddProfile<CarProfile>();
}
57
MichaelCleverly

il s'agit de validation.

cfg.ValidateInlineMaps = false;

devrait suffire

15
mrTurkay