Automapper: bidirectional mapping with ReverseMap() and ForMember()

.net, automapper, bidirectional

Solution

You could define your configuration like this:

Mapper.CreateMap<PartTwo, PartTwoViewModel>()
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer));

Mapper.CreateMap<PartTwoViewModel, PartTwo>()
    .ForMember(dst => dst.Integer, opt => opt.MapFrom(src => src.PartInteger));

UPDATE

Here is the commit where `ReverseMap` was initially implemented. From what I can see in the code, it only creates a simple reverse mapping. For example, in this case it would automatically configure the equivalent of:

Mapper.CreateMap<PartTwoViewModel, PartTwo>();

To get anything more complex, I'm afraid that you're going to have to configure it manually.

Problem

I have the case where I want to map an entity to a viewmodel and back. I have to specify the mapping explicitly with `ForMember()` because their properties do not share the exact same names. Here is a short example of how my classes look like: ``` public class PartTwo { public int Integer { get; set; } } public class PartTwoViewModel { public int PartInteger { get; set; } } ``` And I want to use them this way: ``` Mapper.CreateMap<PartTwo, PartTwoViewModel>() .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer)) .ReverseMap(); var partTwoViewModel = new PartTwoViewModel() { PartInteger = 42 }; var partTwo = Mapper.Map<PartTwoViewModel, PartTwo>(partTwoViewModel); Assert.AreEqual(partTwoViewModel.PartInteger, partTwo.Integer); ``` But it does not match the property `PartInteger` to `Integer`. (`Integer` is `0`.) Is there a way to make this work? (When the properties of both classes have the same names it works.) Do I have to set some kind of option in the method `ForMember()`?

Original source

Related problems