I have the following situation:
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>();
Is it possible to get AutoMapper to:
ParentViewModel.Children
list to objects in the Parent.Children
EntityCollection with matching Ids. Parent.Children
for objects in ParentViewModel.Children
where an object with the id from source is not found in the destination list. Parent.Children
where the destination id does not exist in the source list. Am I going about this all wrong?
I'm afraid automapper is not meant to be used for mapping to a populated object, it will erase the Parent.Children wen you invoke Map(). You have several approaches here:
One is to create yourself the condition to execute the map on childrens:
foreach (var childviewmodel in parentviewmodel.Children) { if (!parent.Children.Select(c => c.Id).Contains(childviewmodel.Id)) { parent.Children.Add(Mapper.Map<Child>(childviewmodel)); } }
Other ifs for other behaviour
One is to create an IMappingAction and hook it in the BeforeMap method:
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(); } } }
..and later on
Mapper.CreateMap<ParentViewModel, Parent>() .BeforeMap<PreventOverridingOnSameIds>();
this way you let automapper do the job.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.