Использование AutoMapper для сопоставления с элементами в списке по соответствующему идентификатору - PullRequest
0 голосов
/ 19 июня 2020

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

Однако, поскольку я хочу обновить это (на основе запроса PUT), каждый из объектов имеет идентификатор. В идеале это означает, что я не просто создаю новые объекты, а лишь сопоставляю существующий объект и его свойства. Теперь для root это достаточно просто, потому что мои сопоставления выглядят так:

CreateMap<MyObj,MyObj>
  .ForMember(dest => dest.Id, opt => opt.Ignore());
CreateMap<MyOtherObj, MyOtherObj>
  .ForMember(dest => dest.Id, opt => opt.Ignore());

Однако, предположим, что MyObj выглядит следующим образом:

public class MyObj
{
  public int Id {get;set;}
  public List<MyOtherObj> Objs {get;set;}
}

И MyOtherObj выглядит так:

public class MyOtherObj 
{
  public int Id {get;set;}
  public string Name {get;set;}
}

Я начинаю со следующего:

var originalObj = new MyObj 
{
  Id = 1,
  Objs = new List<MyOtherObj> 
  {
    new MyOtherObj 
    {
      Id = 1,
      Name = "Apple"
    },
    new MyOtherObj
    {
      Id = 2,
      Name = "Banana"
    }
  }
};

Затем я получаю следующее в запросе PUT:

var updateObj = new MyObj 
{
  Id = 1,
  Objs = new List<MyOtherObj> 
  {
    new MyOtherObj 
    {
      Id = 2,
      Name = "Cherry"
    },
    new MyOtherObj
    {
      Id = 1,
      Name = "Date"
    }
  }
};

Я хотел бы иметь возможность просто сделать что-то вроде:

var mappedObj = _mapper.Map(updateObj, originalObj);

Однако проблема в том, что я не могу понять, как сообщить AutoMapper об идентификаторе, поэтому вместо слепого сопоставления через Objs, он фактически соответствует списку по идентификатору (между исходной и обновленной версиями), а затем применяет сопоставление.

Вопросы:

  1. Возможно ли такое?
  2. Если да, то можно ли продолжить с помощью метода .When () или аналогичного, чтобы я мог: а) обновлять карту для совпадающих идентификаторов, б) создавать новые объекты, где мое обновление содержит идентификаторы, которых нет в оригинале, и c ) удалите из оригинала те объекты, которых нет в обновлении (опять же, по идентификатору и т. Мне не нужно вручную обрабатывать каждое из свойств в моем базовом объекте)?

Спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Следуя подсказке @Lucian Bargaoanu, это возможно с помощью библиотеки AutoMapper.Collection со следующим:

CreateMap<MyObj, MyObj>()
  .ForMember(dest => dest.Id, opt => opt.Ignore())
  .EqualityComparison((dto, entity) => dto.Id == entity.Id); //Updated this line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...