Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AutoMapper Map Child Property that also has a map defined

Tags:

c#

automapper

I have the following Domain Object:

public class DomainClass {     public int Id { get; set; }      public string A { get; set; }     public string B { get; set; } } 

I have the following two objects that I want to map to:

public class Parent  {     public int Id { get; set; }     public string A { get; set; }      public Child Child { get; set; } }  public class Child  {     public int Id { get; set; }     public string B { get; set; } } 

I set up the following maps:

 Mapper.CreateMap<DomainClass, Parent>();  Mapper.CreateMap<DomainClass, Child>(); 

If I map my object using the following call then the parent.Child property is null.

var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); // parent.Child is null 

I know I can write the following:

var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); parent.Child = Mapper.Map<DomainClass, Child>(domain); 

Is there a way I can eliminate that second call and have AutoMapper do this for me?

like image 829
Dismissile Avatar asked Jan 20 '12 16:01

Dismissile


People also ask

Does AutoMapper map nested objects?

With both flattening and nested mappings, we can create a variety of destination shapes to suit whatever our needs may be.

Does AutoMapper map private properties?

AutoMapper will map property with private setter with no problem. If you want to force encapsulation, you need to use IgnoreAllPropertiesWithAnInaccessibleSetter. With this option, all private properties (and other inaccessible) will be ignored.

How do I use AutoMapper to list a map?

How do I use AutoMapper? First, you need both a source and destination type to work with. The destination type's design can be influenced by the layer in which it lives, but AutoMapper works best as long as the names of the members match up to the source type's members.


Video Answer


1 Answers

You just need to specify that in the mapping:

Mapper.CreateMap<DomainClass, Child>(); Mapper.CreateMap<DomainClass, Parent>()       .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id))       .ForMember(d => d.A, opt => opt.MapFrom(s => s.A))       .ForMember(d => d.Child,                   opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s))); 
like image 183
Justin Niessner Avatar answered Oct 14 '22 10:10

Justin Niessner