【发布时间】:2011-09-21 13:21:51
【问题描述】:
由于某种原因,我在 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 数组。因此,例如,如果它包含两个值,我将获得六次或更多次迭代,两个预期值重复。 PlatformID没有定义为二维数组,调试器确认该数组只包含它应该包含的值,没有重复的集合。
我不知道是什么原因造成的。
编辑:使用循环,我有以下断点 -
.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 也存在问题。该方法在每个映射中执行多次。
【问题讨论】:
-
你有没有越过循环?
-
是的,它的迭代次数超出了预期。查看我的编辑了解更多详情
-
我想知道 BeforeMap 是否实际上触发了多次,可能每个 ForMember 一次或其他什么。
-
为什么不把beforeMap代码移到dest.Platforms的实际映射中呢?您也可以将其移至 AfterMap
-
两个都试一下。现在做不到 - 远离开发机器。
标签: c# loops foreach automapper