AutoMapper отображает объекты в исходном дочернем списке на существующие объекты в целевой коллекции дочерних объектов - PullRequest
3 голосов
/ 07 января 2011

У меня следующая ситуация:

public class Parent : EntityObject
{
    EntityCollection<Child> Children { get; set; }
}

public class Child : EntityObject
{
    int Id { get; set; }
    string Value1 { get; set; }
    string Value2 { get; set; }
}

public class ParentViewModel
{
    List<ChildViewModel> Children { get; set; }
}

public class ChildViewModel
{
    int Id { get; set; }
    string Value1 { get; set; }
    string Value2 { get; set; }
}

Mapper.CreateMap<ParentViewModel, Parent>();

Mapper.CreateMap<ChildViewModel, Child>();

Можно ли получить AutoMapper для:

  • Сопоставить объекты в списке ParentViewModel.Children с объектами в коллекции Parent.Children EntityCollection с соответствующими идентификаторами.
  • Создание новых объектов в Parent.Children для объектов в ParentViewModel.Children, где объект с идентификатором из источника не найден в списке адресатов.
  • Удалите объекты из Parent.Children, если идентификатор назначения не существует в списке источников.

Я все делаю неправильно?

1 Ответ

2 голосов
/ 21 февраля 2012

Боюсь, что автомаппер не предназначен для отображения на заполненный объект, он сотрет Parent.Children, когда вы вызовете Map ().У вас есть несколько подходов:

  • Один из них - создать себе условие для выполнения карты для детей:

    foreach (var childviewmodel in parentviewmodel.Children)
    {
        if (!parent.Children.Select(c => c.Id).Contains(childviewmodel.Id))
        {
            parent.Children.Add(Mapper.Map<Child>(childviewmodel));
        }
    }
    

    Другие ifs для другого поведения

  • Один из них - создать IMappingAction и подключить его к методу BeforeMap:

    class PreventOverridingOnSameIds : IMappingAction<ParentViewModel, Parent>
    {
        public void Process (ParentViewModel source, Parent destination)
        {
            var matching_ids = source.Children.Select(c => c.Id).Intersect(destination.Children.Select(d => d.Id));
            foreach (var id in matching_ids)
            {
                source.Children = source.Children.Where(c => c.Id != id).ToList();
            }
        }
    }
    

    .., а затем

    Mapper.CreateMap<ParentViewModel, Parent>()
        .BeforeMap<PreventOverridingOnSameIds>();
    

    таким образом, вы разрешите autopperделать работу.

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