Skip to content

Reverse mapping #3329

Description

@timmi-on-rails

While I was trying to find a solution to issue #3129, I came across two related problems.
I spent a couple hours looking at the AutoMapper code and found no easy way to fix.
I guess it needs a little more work and insight and I could use some help.

Basically there are 3 things, that need a fix:

  1. ReverseMap() works in combination with MapFrom(...expression...), but doesn't with
    MapFrom(...sourceMemberName...).

    So this works as expected:

    cfg.CreateMap<Client, ClientDto>()
       .ForMember(d => d.Id, opt => opt.MapFrom(s => s.LocalId))
       .ReverseMap();

    But this does not work:

    cfg.CreateMap<Client, ClientDto>()
       .ForMember(d => d.Id, opt => opt.MapFrom("LocalId"))
       .ReverseMap();

    I spotted the problem, basically the implementation(s) of IPropertyMapConfiguration.Reverse() do
    not support the case without a source expression.

  2. The issue Attribute-based Reverse Mapping with SourceMember does not work #3129 addresses that the reverse mapping does not work properly when using the AutoMapAttribute together with the SourceMemberAttribute. There are two reasons. One reason is the problem 1, which I just stated and the next one is, that AutoMapper handles the SourceMemberAttribute's after the reverse mapping has been created.
    If I switch the order, all unit tests run through, so I guess it comes down to fixing problem 1.

  3. When creating a ReverseMap() with MapFrom(...expression...) on a destination member and if there is a source property with the same name as the destination property, it will get reverse mapped aswell. So a ClientDto with Id = 10 will reverse map to a Client with Id = 10 and LocalId = 10. I do not expect that, because it should be a 1 to 1 mapping, right?
    To fix that we would need some Ignore() for the reverse mapping, when using MapFrom.
    I don't have a solution, yet.

So here are the classes:

public class Client
{
    public int LocalId { get; set; }

    public int Id { get; set; }
}

[AutoMap(typeof(Client), ReverseMap = true)]
public class ClientDto
{
    [SourceMember("LocalId")]
    public int Id { get; set; }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions