2014-12-08 3 views
12

Мы используем Automapper для проекта, и, кажется, чтобы получить следующее сообщение об ошибке в случайном порядке:членов Auto Mapper неотображённых были найдены

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.AssertConfigurationIsValid(); 

не знаю, почему он жалуется отображения не являются хорошими, а затем обновить и снова хорошо, кто-нибудь работать в этом? Отладка не помогает, так как она случайна, иногда нет ошибок, а затем в другие дни она будет всплывать где-то на сайте, вернуться к ней, и все в порядке. Ошибка также возникает на случайных страницах, а не на одной странице, а не на одном и том же сопоставлении.

+1

Вероятно, это "прекрасно работает" после этого, так как вызов 'AssertConfigurationIsValid' происходит при запуске приложения, и приложение теперь запущено, и поэтому он не будет вызван снова. –

+0

Внутреннее исключение должно точно указать, в чем проблема. –

+0

@KirkWoll Я тоже предполагал, что это связано с тем, что приложение запускается впервые в течение дня, возможно, что-то еще не готово, пока оно выполняется. Я попытался сбросить IIS и пул приложений, но опять-таки случайный не смог реплицировать ошибку. – Paritosh

ответ

19

Эта проблема возникает, когда вы пытаетесь сопоставить объект, для которого вы не создали конфигурацию отображения. Что нужно иметь в виду, так это то, что это не должен быть конкретный объект, который вы пытаетесь сопоставить; но одно из его навигационных свойств.

Скажем, например у вас есть 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>(); 
} 
+3

есть ли способ просто игнорировать не отображаемые свойства? – tchelidze

+0

@tchelidze Да, вы можете игнорировать свойства: «.ForMember (dest => dest.Users, options => options.Ignore()» – SimonD

+3

@SimonD Спасибо Саймон, я имею в виду игнорировать членов неявно не явно – tchelidze

Смежные вопросы