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.
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>();
}
il s'agit de validation.
cfg.ValidateInlineMaps = false;
devrait suffire