Questo problema si verifica quando si tenta di mappare un oggetto per cui non è stata creata una configurazione di mappatura. Quello che devi tenere a mente è che non deve essere l'oggetto specifico che stai cercando di mappare; ma una delle sue proprietà di navigazione.
Dire per esempio si dispone di un Car.cs
che si desidera mappare a un CarDTO.cs
Il Car.cs
assomiglia a questo:
public class Car
{
public string Color { get; set; }
public Engine Engine { get; set; }
}
E il tuo DTO sembra la stessa, ma ha un riferimento al EngineDTO
invece:
public class CarDTO
{
public string Color { get; set; }
public EngineDTO Engine { get; set; }
}
Hai configurato la mappatura in questo modo:
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>();
Tutto sembra a posto, giusto? Tuttavia, nel vostro EngineDTO
, probabilmente avete una proprietà di navigazione come, consente di dire:
public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}
Così, mentre Automapper è Mapping Engine
-EngineDTO
, si cerca anche di mappare i PartDTO
, ma dal momento che si è dimenticato di dichiarare la mappatura nel global.asax
, si ottiene l'errore:
AutoMapper.AutoMapperConfigurationException: Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
Se non si desidera mappare determinate proprietà su una classe, è possibile utilizzare Ignora:
Mapper.CreateMap<Engine, EngineDTO>()
.ForMember(x => x.Parts, opt => opt.Ignore());
EDIT:
Per una configurazione automapper più robusto, suggerisco di utilizzare i profili di mappatura, invece di dichiarare la mappatura direttamente Global.asax
. Ecco un esempio:
Profilo:
public class CarProfile : Profile
{
public CarProfile()
{
CreateMap<Car, CarDTO>();
}
}
Global.asax:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<CarProfile>();
}
Probabilmente "funziona bene", dopo che, poiché la chiamata a 'AssertConfigurationIsValid' accade all'avvio app, e il l'app è ora avviata e quindi non viene richiamata di nuovo. –
L'eccezione interna dovrebbe dirti esattamente qual è il problema. –
@KirkWoll Stavo indovinando lo stesso, che è dovuto all'avvio dell'applicazione per la prima volta durante il giorno, forse qualche cosa non è pronta mentre sta facendo la sua mappatura. Ho provato a resettare IIS e il pool di app, ma di nuovo è casuale non è stato in grado di replicare l'errore. – Paritosh