Сопоставьте объект LLBLGen с DTO

Я пытаюсь создать сопоставление между объектом LLBLGen и DTO с помощью AutoMapper.

Мой DTO выглядит следующим образом:

// Parent
public int Id { get; set; }
public List<Child> Children{ get; set; } // One to Many

// Child
public int Id { get; set; }
public int Parent { get; set; } // Foreign key to parent Id

ParentEntity содержит ChildCollection с тем же именем, что и список DTO, и идентификатором (с другими полями LLBL, которые необходимо игнорировать). Поэтому, когда ParentEntity сопоставляется с родительским DTO, он также должен сопоставлять ChildCollection со списком дочерних элементов.

Это то, что я получил до сих пор:

ParentEntity parentEntity = new ParentEntity(id);

AutoMapper.Mapper.CreateMap<ParentEntity, Parent>();
AutoMapper.Mapper.CreateMap<ChildCollection, List<Child>>();

var parent = AutoMapper.Mapper.Map<Parent>(parentEntity);

Это приводит к тому, что идентификатор отображается, но список имеет счетчик 0.

Как я могу заставить его работать?


ОБНОВИТЬ:

Пробовал то же самое, что и моя предыдущая попытка, но ручное сопоставление списка дочерних элементов также приводит к той же проблеме: идентификатор сопоставляется, но список пуст.

Mapper.CreateMap<ParentEntity, Parent>()
    .ForMember(dto => dto.Children, opt => opt.MapFrom(m => m.Children));

person Sam    schedule 28.12.2015    source источник
comment
Пожалуйста, покажите ChildCollection класс. Каков тип его свойства List? Я думаю, что лучше предоставить полный соответствующий исходный код ваших объектов и DTO, чтобы решить, почему сопоставление не работает.   -  person Ilya Chumakov    schedule 30.12.2015
comment
DTO уже показаны в моем вопросе. ChildCollection содержит ChildEntities, которые содержат те же поля, что и DTO, и гораздо больше ресурсов, связанных с LLBL. Вставка полных ресурсов этих коллекций/сущностей будет бесполезной и излишней. Если вы раньше работали с LLBL, то должны иметь представление о том, что содержат эти классы.   -  person Sam    schedule 30.12.2015


Ответы (1)


Эта строка не помогает:

AutoMapper.Mapper.CreateMap<ChildCollection, List<Child>>();

Вместо этого вы должны добавить явную карту класса в класс:

AutoMapper.Mapper.CreateMap<ChildEntity, Child>();

И затем вы должны указать точные свойства для сопоставления. Оба свойства должны иметь тип списка или аналогичный (List<ChildEntity> в качестве источника и List<Child> в качестве назначения). Итак, если классы ParentEntity и Parent имеют свойство Children, вам даже не нужно указывать:

.ForMember(dto => dto.Children, opt => opt.MapFrom(m => m.Children));

отображение по умолчанию достаточно:

  Mapper.CreateMap<ParentEntity, Parent>();
person Ilya Chumakov    schedule 30.12.2015
comment
Ты нашел это! Решение заключалось в том, что для ChildEntity и Child DTO требовалось явное сопоставление классов. Я предположил, что проблема была более сложной и как-то связана с тем, что типы списка не похожи, как вы упомянули, потому что LLBL имеет собственную реализацию списка (EntityCollections). Спасибо! - person Sam; 30.12.2015