В идеале я бы хотел использовать 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
, он фактически соответствует списку по идентификатору (между исходной и обновленной версиями), а затем применяет сопоставление.
Вопросы:
- Возможно ли такое?
- Если да, то можно ли продолжить с помощью метода .When () или аналогичного, чтобы я мог: а) обновлять карту для совпадающих идентификаторов, б) создавать новые объекты, где мое обновление содержит идентификаторы, которых нет в оригинале, и c ) удалите из оригинала те объекты, которых нет в обновлении (опять же, по идентификатору и т. Мне не нужно вручную обрабатывать каждое из свойств в моем базовом объекте)?
Спасибо!