Подтвердить что ты не робот

Выбранные элементы Auto Mapper Unmapped

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

AutoMapper.AutoMapperConfigurationException: Найдены неподключенные элементы. Просмотрите типы и элементы ниже. Добавьте настраиваемое выражение отображения, проигнорируйте, добавьте настраиваемый преобразователь или измените тип источника/назначения

Код не был изменен в течение нескольких месяцев. Я получаю эту ошибку, обновляюсь и ошибка уходит, и страница работает нормально. Я использую

Mapper.AssertConfigurationIsValid();

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

4b9b3361

Ответ 1

Быстрое редактирование вступления: как @mrTurkay отвечает ниже, это можно решить с помощью следующей конфигурации:

cfg.ValidateInlineMaps = false;

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

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

Например, у вас есть Car.cs который вы хотите сопоставить с CarDTO.cs

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 отображает из Engine в EngineDTO, он также пытается PartDTO, но, поскольку вы забыли объявить отображение в global.asax, вы получите ошибку:

AutoMapper.AutoMapperConfigurationException: были найдены несопоставленные элементы. Просмотрите типы и членов ниже. Добавить пользовательское выражение сопоставления, игнорировать, добавить пользовательский преобразователь или изменить тип источника/назначения

Если вы не хотите отображать определенные свойства в классе, вы можете использовать Ignore:

Mapper.CreateMap<Engine, EngineDTO>()
    .ForMember(x => x.Parts, opt => opt.Ignore());

РЕДАКТИРОВАТЬ:

Для более надежной конфигурации AutoMapper я предлагаю использовать профили сопоставления вместо того, чтобы объявлять сопоставление непосредственно в Global.asax. Вот пример:

Профиль:

public class CarProfile : Profile
{
    public CarProfile ()
    {
        CreateMap<Car, CarDTO>();
    }
}

Global.asax:

Mapper.Initialize(cfg =>
{
     cfg.AddProfile<CarProfile>();
}

Ответ 2

речь идет о проверке.

cfg.ValidateInlineMaps = false;

должно быть достаточно