lukeck
lukeck

Reputation: 4758

AutoMapper mapping objects in source child list to existing objects in destination child entity collection

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:

Am I going about this all wrong?

Upvotes: 3

Views: 4851

Answers (1)

WDRust
WDRust

Reputation: 3713

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:

  • Create the condition to execute the map on children youself:

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

Add more if()s for other behaviour

  • 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.

Upvotes: 4

Related Questions