2014-12-08 12 views
12

Stiamo usando Automapper per un progetto, e sembra di avere il seguente errore in modo casuale:membri Auto Mapper non mappati sono stati trovati

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

Il codice non è stato modificato in mesi. Ottengo quell'errore, l'aggiornamento e l'errore sono andati e la pagina funziona correttamente. Sto usando

Mapper.AssertConfigurationIsValid(); 

non so perché si lamenta le mappature non sono buone e quindi un aggiornamento ed è bene ancora una volta, qualcuno ha eseguito in questo? Il debug non aiuta in quanto è casuale, a volte non ci sono errori e in altri giorni verrà visualizzato da qualche parte nel sito, tornare ad esso ed è tutto a posto. L'errore si presenta anche su pagine a caso, non sulla stessa pagina, non sulla stessa mappatura.

+1

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. –

+0

L'eccezione interna dovrebbe dirti esattamente qual è il problema. –

+0

@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

risposta

19

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>(); 
} 
+3

esiste un modo per ignorare le proprietà non mappate? – tchelidze

+0

@tchelidze Sì, è possibile ignorare le proprietà: ".ForMember (dest => dest.Users, options => options.Ignore()" – SimonD

+3

@SimonD Grazie Simon, ciò che intendo è ignorare i membri implicitamente non esplicitamente – tchelidze

Problemi correlati