AutoMapper映射中foreach循环的额外迭代

8
由于某些原因,我在AutoMapper映射定义中使用的循环迭代次数超过了应有的次数。
映射定义如下:
    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());

BeforeMap中的foreach循环会出现某种原因导致对s.PlatformIDs数组进行多次迭代。例如,如果它包含两个值,我将得到六个或更多迭代,其中重复了两个期望的值。PlatformIDs不是定义为二维数组,并且调试器确认数组只包含应有的值,没有重复的集合。我困惑于可能导致这种情况发生的原因。
编辑:使用循环,我有以下断点-
.BeforeMap((s, d) =>
{
    foreach (var platId in s.PlatformIDs) // breakpoint 1
    {
        Platform newPlat = _gameRepository.GetPlatform(platId); // breakpoint 2

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

第一次正常通过 - 断点1 -> 断点2 -> 断点3。然后它会回到2,再到3,这是预期的。奇怪的是,它会跳回断点1,重新开始整个过程。
我不确定是否有模式。两个数组值需要六次通过。一个数组值需要四次通过。
编辑2:我的直觉是正确的 - BeforeMap 触发了多次。
编辑3:问题在 AfterMap 中仍然存在。该方法每次映射执行多次。

你有没有越过循环? - boca
是的,它正在进行比应该更多的迭代。请查看我的编辑以获取更多详细信息。 - Major Productions
我想知道BeforeMap是否会多次触发,也许是每个ForMember一次。 - Major Productions
1
为什么不将 beforeMap 代码移动到 dest.Platforms 的实际映射中?您也可以将其移动到 AfterMap。 - boca
我会两者尝试。现在无法完成 - 远离开发机器。 - Major Productions
1个回答

4

根据类似的情况,似乎是一个合法的bug:http://automapper.codeplex.com/workitem/6604。我在AutoMapper的GitHub上把它写成了问题,并将该问题链接到这个问题上,以便开发人员可以看到我尝试做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接