Auto Mapper Unmapped members were found
Quick intro edit: as @mrTurkay answers below, this can be solved with the following configuration:
cfg.ValidateInlineMaps = false;
However, you should understand why the problem occours in the first place - so feel free to read on.
This problem occours when you're trying to map an object that you didn't create a mapping configuration for. What you need to keep in mind is, that it doesn't have to be the specific object you're trying to map; but one of it's navigation properties.
Say for instance you have a Car.cs
that you want to map to a CarDTO.cs
The Car.cs
looks like this:
public class Car
{
public string Color { get; set; }
public Engine Engine { get; set; }
}
And your DTO looks the same, but has a reference to the EngineDTO
instead:
public class CarDTO
{
public string Color { get; set; }
public EngineDTO Engine { get; set; }
}
You configured the mapping like this:
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>();
All looks fine, right? However, in your EngineDTO
, you probably have a navigation property like, lets say:
public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}
So while Automapper is Mapping from Engine
to EngineDTO
, it also tries to Map the PartDTO
, but since you forgot to declare the mapping in the global.asax
, you get the error:
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
If you don't want to map certain properties on a class, you can use Ignore:
Mapper.CreateMap<Engine, EngineDTO>()
.ForMember(x => x.Parts, opt => opt.Ignore());
EDIT:
For a more robust AutoMapper configuration, I suggest that you use mapping profiles, instead of declaring the mapping directly in Global.asax
. Here is an Example:
Profile:
public class CarProfile : Profile
{
public CarProfile ()
{
CreateMap<Car, CarDTO>();
}
}
Global.asax:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<CarProfile>();
}
it is about validation.
cfg.ValidateInlineMaps = false;
should be enough
In my case, I had forgotten to add Map Configuration to MapConfig.cs.