Я использую 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, но это добавляет сложности к отображениям и т. Д.