【问题标题】: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 的方法 BeforeMap 和 AfterMap 似乎有一个严重的错误,如果尝试遍历源对象的集合以填充目标对象的属性,则这些映射方法会执行多次.见: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大神以后会揍我的。