AutoMapper 3中不一致的映射行为

ICodeForCoffee

在MVC 5中,有时将AutoMapper 3将相关实体从实体框架映射到视图模型时遇到问题,我使用EF 6.1.1来获取数据,并使用轻薄的存储库层来集中查询。该问题似乎只发生在根实体下的实体的映射属性中,但是此问题是间歇性的。我已经看到,在重建解决方案之后,该行为又重新开始工作,并且在重建解决方案后,在没有更改发生问题的代码的情况下,行为中断了。

我已经在调试器和SQL事件探查器中对此进行了测试,即使没有在前端显示数据,我也可以在SQL事件探查器中看到Entity Framework正在加载相关表。

带有问题的示例映射

从存储库层查询数据后,此代码在MVC控制器中执行。然后将视图模型传递给视图以进行渲染。

Mapper.CreateMap<Event, EventViewModel>()
    .ForMember(e => e.EventTitleId, opt => opt.MapFrom(x => x.EventTitleType.EventTitleId));
EventViewModel model = Mapper.Map<Event, EventViewModel>(eventItem);

//Fix Up I had to implement to ensure the data gets into the property
model.EventTitleId = eventItem.EventTitleType.EventTitleId;

与此问题对应的另一个示例

在不同的控制器动作,相同的问题下,相同的基本执行路径。

Mapper.CreateMap<Event, EventViewModel>()
    .ForMember(l => l.EventTitle, opt => opt.MapFrom(x => x.EventTitleType.EventTitle.Title))
    .ForMember(l => l.EventType, opt => opt.MapFrom(x => x.EventTitleType.LkEventType.Title))
    .ForMember(l => l.LocationName, opt => opt.MapFrom(x => x.LkLocation.LocationName));
IEnumerable<EventViewModel> eventList = Mapper.Map<IEnumerable<Event>, IEnumerable<EventViewModel>>(events);

同样,有时这三个属性获取数据,有时却没有。

资料模型

这就是数据模型的样子。

edmx文件中带有此问题的数据模型的部分

资料库

存储库层包装了实体框架调用,但没有抽象出实体框架实体及其所具有的问题和好处。项目中的所有存储库都继承IRepository,并且我正在使用这一层来集中查询和业务逻辑。

using System.Collections.Generic;

namespace Tools.Repository
{
    /// <summary>
    /// Generic Repository Interface
    /// </summary>
    /// <typeparam name="TClass">Class that the Repository is implemented for.</typeparam>
    public interface IRepository<TClass>
        where TClass : class 
    {
        void SaveChanges();
        TClass Find(params object[] keyValues);
        IEnumerable<TClass> GetAll();
        TClass Add(TClass itemToAdd);
        TClass Update(TClass itemToUpdate);
        TClass Remove(TClass itemToDelete);
    }
}

概要

我不认为这是一个Entity Framework延迟加载问题,并且在迫使EF渴望加载数据之后,问题仍然存在。实体在映射之前在调试器中具有值,但是仅有时将值映射到视图模型。最令人沮丧的是,该问题似乎不是由我对视图模型所做的任何更改引起的。

是什么导致这种不一致的行为?我在AutoMapper 3.2.1和3.1.1中都遇到了这个问题。

格特·阿诺德

问题是您在使用映射之前就创建(配置)了映射。现在,巧合的是首先创建哪个映射,然后才能流行。

AutoMapper文档说:

如果您使用静态Mapper方法,则每个AppDomain只能进行一次配置。这意味着放置配置代码的最佳位置是在应用程序启动中,例如ASP.NET应用程序的Global.asax文件。

这意味着您Event之间只有一个映射EventViewModel,这可能应该是您现在拥有的两个映射的组合。

顺便说一句,您可以通过执行临时映射DynamicMap

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章