Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extra iterations in a foreach in an AutoMapper map

For some reason, a loop that I use in an AutoMapper map definition is iterating more than it should.

The map definition:

    Mapper.CreateMap<AdminGameEditModel, Game>()
        .BeforeMap((s, d) =>
        {
            foreach (var platId in s.PlatformIDs)
            {
                Platform newPlat = _gameRepository.GetPlatform(platId);

                d.Platforms.Add(newPlat);
            }
        })
        .ForMember(dest => dest.BoxArtPath, opt => opt.Ignore())
        .ForMember(dest => dest.IndexImagePath, opt => opt.Ignore())
        .ForMember(dest => dest.Cons, opt => opt.MapFrom(src => String.Join("|", src.Cons)))
        .ForMember(dest => dest.Pros, opt => opt.MapFrom(src => String.Join("|", src.Pros)))
        .ForMember(dest => dest.LastModified, opt => opt.UseValue(DateTime.Now))
        .ForMember(dest => dest.Platforms, opt => opt.Ignore());

The foreach in BeforeMap will, for some reason, iterate over the s.PlatformIDs array multiple times. So, for example, if it contains two values, I'll get six or more iterations, with the two expected values repeating. The PlatformIDs are not defined as a two dimensional array, and the debugger confirms that the array only contains the values it should, with no repeating sets.

I'm stumped as to what could be causing it.


EDIT: With the loop, I have the following breakpoints -

.BeforeMap((s, d) =>
{
    foreach (var platId in s.PlatformIDs) // breakpoint 1
    {
        Platform newPlat = _gameRepository.GetPlatform(platId); // breakpoint 2

        d.Platforms.Add(newPlat);
    } // breakpoint 3
})

The first pass is normal - breakpoint 1 -> breakpoint 2 -> breakpoint 3. It will then go back to 2, then to 3, which is expected. What's weird is that it will then jump back to breakpoint 1, and start the process over again.

I'm not sure if there's a pattern. Two array values results in six passes. One array value results in four passes.


EDIT 2: My hunch was right - BeforeMap is firing more than once.


EDIT 3: The problem persists in AfterMap as well. The method executes more than once per mapping.

like image 878
Major Productions Avatar asked Jun 23 '11 20:06

Major Productions


1 Answers

Appears to be a legit bug, judging by something similar: http://automapper.codeplex.com/workitem/6604. I've written it up as an issue on AutoMapper's GitHub, and have linked that issue to this question so the devs can see what I was attempting to do.

like image 82
Major Productions Avatar answered Sep 17 '22 13:09

Major Productions