我从未在Automapper之前遇到过这种奇怪的行为。首先,我使用的是Automapper 3.3.0和Entity Framework 6.1.3。我有一个通过实体框架检索实体数据的方法。在返回数据之前,它将其映射到域模型。除了三(3)个属性之外,相关属性的名称在实体和域之间匹配,因此您将在我提供的示例代码中看到创建映射时只有三(3)个ForMember调用。 / p>
这在大多数情况下都能正常工作,正如我所期望的那样。然而,偶尔,我不能为我的生活指出重复的确切步骤,映射成功,除了三(3)显式映射的属性。
以下是我认为相关的代码:
var dailyPriceHistories =
MapToDomain(_clearDbEntities.get_DailyPriceHistory(startDate.Date, endDate.Date).ToList());
仅供参考,ToList调用旨在防止来自EF的延迟加载问题。
而且,映射器:
private static IList<DailyPriceHistory> MapToDomain(List<get_DailyPriceHistory_Result> someDataEntities)
{
Mapper.CreateMap<get_DailyPriceHistory_Result, DailyPriceHistory>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.DailyPriceHistory_ID))
.ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.AllProducts_ID))
.ForMember(dest => dest.DateInfoId, opt => opt.MapFrom(src => src.DateInfo_ID));
return Mapper.Map<List<get_DailyPriceHistory_Result>, List<DailyPriceHistory>>(dailyPriceHistoryEntities);
}
如果我做了iisreset,一切都很好,它再次起作用。当我在Visual Studio 2013中使用调试模式来回走动时,似乎就会发生这种情况。就像忘记如何映射这些属性一样。传入的实体数据总是包含值,顺便说一下,它根本无法将三个值映射到域。
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
Mapper.CreateMap不是线程安全的(也不是真正的用途)。您应该只在启动时创建一次地图,通常在Global.asax的App_Start中为ASP.NET应用程序启动。