Эта проблема возникает, когда вы пытаетесь сопоставить объект, для которого вы не создали конфигурацию отображения. Что нужно иметь в виду, так это то, что это не должен быть конкретный объект, который вы пытаетесь сопоставить; но одно из его навигационных свойств.
Скажем, например у вас есть Car.cs
, которые вы хотите отобразить в CarDTO.cs
The Car.cs
выглядит следующим образом:
public class Car
{
public string Color { get; set; }
public Engine Engine { get; set; }
}
И ваш DTO выглядит так же, но есть ссылка на EngineDTO
вместо этого:
public class CarDTO
{
public string Color { get; set; }
public EngineDTO Engine { get; set; }
}
Вы настроили отображение следующим образом:
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>();
Все выглядит хорошо, правда? Тем не менее, в вашем EngineDTO
, вы, вероятно, имеют свойство навигации, как, позволяет сказать:
public class EngineDTO
{
public List<PartDTO> Parts { get; set; }
}
Таким образом, хотя Automapper является Mapping от Engine
к EngineDTO
, он также пытается Сопоставьте PartDTO
, но так как вы забыли объявить отображение в global.asax
, вы получите ошибку:
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
Если вы не хотите, чтобы отобразить определенные свойства на классе, вы можете использовать Игнорируйте:
Mapper.CreateMap<Engine, EngineDTO>()
.ForMember(x => x.Parts, opt => opt.Ignore());
EDIT:
Для более надежной конфигурации AutoMapper, я предлагаю вам использовать профили отображения, вместо того, чтобы объявить отображение непосредственно в Global.asax
. Вот пример:
профиля:
public class CarProfile : Profile
{
public CarProfile()
{
CreateMap<Car, CarDTO>();
}
}
Global.asax:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<CarProfile>();
}
Вероятно, это "прекрасно работает" после этого, так как вызов 'AssertConfigurationIsValid' происходит при запуске приложения, и приложение теперь запущено, и поэтому он не будет вызван снова. –
Внутреннее исключение должно точно указать, в чем проблема. –
@KirkWoll Я тоже предполагал, что это связано с тем, что приложение запускается впервые в течение дня, возможно, что-то еще не готово, пока оно выполняется. Я попытался сбросить IIS и пул приложений, но опять-таки случайный не смог реплицировать ошибку. – Paritosh