Неполное отображение во вложенных списках / циклическая зависимость - PullRequest
1 голос
/ 04 октября 2019

Я использую Automapper для сопоставления моих EF-сущностей с классами ViewModel.

Это моя модель:

public class Audit: Model
{ 
    ...
    public ICollection<Answer> AuditResults { get; set; }
    public AuditCatalog AuditCatalog { get; set; }
}

public class AuditCatalog : Model
{
    ...
    public ICollection<Question> Questions { get; set; }
    public ICollection<Answer> Answers { get; set; }
    public ICollection<Audit> Audits { get; set; }
}

public class Question : Model
{
    ...
    public ICollection<Answer> Answers { get; set; }
    public ICollection<AuditCatalog> AuditCatalogs { get; set; }
}

public class Answer: Model
{
    ...

    public ICollection<Question> Questions  { get; set; }
    public ICollection<Audit> ResultInAudits { get; set; }
    public ICollection<AuditCatalog> AuditCatalogs { get; set; }
}  

Моя ViewModel выглядит точно так же (за исключением дополнительных или ненужных). материал). Вы также можете подумать: «О, Боже! Эта модель имеет бесполезные и многим ссылки« многие ко многим »!». Фактически я отслеживаю изменения на Question с и Answer с и логически удаляю записи, поэтому давайте просто скажем, что мне все это нужно.

Проблема:

После отображения Audit EF-сущностей (которые полностью заполнены) некоторые списки ViewModel содержат нулевые записи.

Подробно:

  • Audit.AuditResults OK
  • Audit.AuditCatalog.Questions OK
  • Audit.AuditCatalog.Answers 6 записей, 4 из них null

Я думаю, что есть проблема с циклическими ссылками многих кмного отношений. Сначала я подумал, что после сопоставления записей AuditResults automapper выполняется с Answer s и просто заполняет Audit.AuditCatalog.Answers уже известные объекты, но только 1 запись (из 2 записей, которые не являются нулевыми) уже находится в AuditResults.

Обходной путь

В конфигурации я проигнорировал первый список Answer с.

CreateMap<Audit, AuditVM>()
    .ForMember(a => a.AuditResults, opt => opt.Ignore());

Карта ...

var auditVM = mapper.Map<AuditVM>(audit);

... и затем сопоставьте результаты

auditVM.AuditResults = mapper.Map<List<Answer>, 
    List<AnswerVM>>audit.AuditResults.ToList()); 

Вопрос

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

Я также думаю о выравнивании моих моделей ViewModel, но это добавляет сложности к отображениям и т. Д.

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