【问题标题】:AutoMapper - mapping properties from one EF4 entity to another in a loop without Before/AfterMapAutoMapper - 在没有 Before/AfterMap 的循环中将属性从一个 EF4 实体映射到另一个实体
【发布时间】:2011-09-22 08:06:39
【问题描述】:

AutoMapper 的方法 BeforeMapAfterMap 似乎有一个严重的错误,如果尝试遍历源对象的集合以填充目标对象的属性,则这些映射方法会执行多次.见:Extra iterations in a foreach in an AutoMapper map

我正在尝试做的有点复杂,所以请多多包涵。

我有一个 EF4 多对多图(游戏到平台),我正在尝试根据传入的表单数据构建。为了构建图表,我采用来自表单的原始整数 ID,然后从我的存储库中获取正确的平台,以便将它们添加到游戏的集合中。您可以在我上面提供的链接中的BeforeMap 中看到我这样做的尝试。

问题是我不确定如何继续。我需要能够抓住目标(游戏)对象才能成功Add 游戏平台。在ForMember 中是否有可能发生这样的事情?根据我的阅读,自定义解析器似乎不适合我,而且我不确定如何在给定所有移动部件(两个实体,存储库)的情况下实现自定义类型转换器。

有什么想法或建议吗?

【问题讨论】:

    标签: c# asp.net-mvc-2 entity-framework-4 automapper


    【解决方案1】:

    我只是决定制作自己的静态映射器。不是一个理想的,甚至不是很好的解决方案,但它确实有效。它绝对可以变得更抽象,但我认为它是一个创可贴,直到 AutoMapper 被修复。我的解决方案:

    public static class GameMapper
    {
        public static Game Map(IGameRepository repo, AdminGameEditModel formData, Game newGame)
        {
            newGame.GameID = formData.GameID;
            newGame.GameTitle = formData.GameTitle;
            newGame.GenreID = formData.GenreID;
            newGame.LastModified = DateTime.Now;
            newGame.ReviewScore = (short)formData.ReviewScore;
            newGame.ReviewText = formData.ReviewText;
            newGame.Cons = String.Join("|", formData.Cons);
            newGame.Pros = String.Join("|", formData.Pros);
            newGame.Slug = formData.Slug;
    
            if (newGame.Platforms != null && newGame.Platforms.Count > 0)
            {
                var oldPlats = newGame.Platforms.ToArray();
    
                foreach (var oldPlat in oldPlats)
                {
                    newGame.Platforms.Remove(oldPlat);
                }
            }
    
            foreach (var platId in formData.PlatformIDs)
            {
                var plat = repo.GetPlatform(platId);
                newGame.Platforms.Add(plat);
            }
    
            return newGame;
        }
    }
    

    很遗憾,我无法将第三个参数设为out 参数,因为我需要在更新期间覆盖现有实体数据。同样,这绝对不是一个漂亮的,甚至不是好的解决方案,但它确实可以完成工作。我敢肯定OO大神以后会揍我的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2014-07-09
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多