AutoMapper 6.2.2 создает исключение StackOverflowException при отображении объектов с циклическими ссылками (хотя соответствующие свойства имеют значение NULL) - PullRequest
0 голосов
/ 12 октября 2018

Мы используем EntityFramework 6.2.0 в сочетании с Automapper 6.2.2 для отображения между сущностями и DTO.К сожалению, с некоторыми из этих отображений System.StackOverflowException возникает снова и снова.После обширных исследований мы уже попробовали несколько вещей, чтобы решить эту проблему:

  • Настройка MaxDepth (глобальная)
  • Настройка PreserveReferences (глобальная)
  • Включение /Отключение CreateMissingTypeMaps (global)
  • Попытка понять план выполнения

Пока проблема не устранена.В различных статьях говорится, что в DTO следует избегать циклических ссылок, что, к сожалению, НЕ в нашем случае.

Пример циклической ссылки:

public class OneDTO
{
    public Guid Id { get; set; }
    public List<OtherDTO> Others { get; set; }
}

public class OtherDTO
{
    public Guid Id { get; set; }
    public OneDTO One { get; set; }
}

public class Profiles : Profiles
{
    public Profiles()
    {
        CreateMap<One, OneDTO>().ReverseMap();
        CreateMap<Other, OtherDTO>().ReverseMap();
    }
}

Однако проблема также возникает, если эти предположительныесвойства циклической ссылки вообще не установлены, т. е. имеют значение NULL.Но если вы полностью удалите эти свойства из класса, ошибка больше не возникнет.

Есть ли другие возможные причины, кроме циклических ссылок?Может ли эта ошибка также возникнуть из-за неправильной конфигурации?В большинстве случаев мы используем такое сопоставление:

CreateMap<One, OneDTO>().ReverseMap();

Метод AssertConfigurationIsValid полон предупреждений о том, что «были найдены неотображенные элементы.

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

В качестве дополнительного примечания, если оно уместно: Мы используем SimpleInjector в качестве контейнера DIкоторый мы используем, чтобы связать MappingConfiguration в центральном месте и внедрить его в необходимые места, где существует зависимость от IMapper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...