自动映射EF6动态代理

时间:2016-08-03 11:46:13

标签: model-view-controller entity-framework-6 automapper dynamic-proxy

我们首先开发EF6 Web项目代码。 在审查了我们项目的许多不同方法后,我们决定将我们的解决方案划分为这些项目:

  • "型号" project,包含EF DataContext和所有实体
  • "服务"项目,包含所有登录,调用实体以检索数据并将DTO中的数据发送到Web项目。
  • "网页和#34;项目,视图模型,控制器和视图。

在服务层,我们为每个需要发送到Web层的实体创建DTO。因此,我们从模型层获得实体,然后我们将这些实体转换为服务层中的DTO,并将这些DTO发送到Web层。 最后在Web层中,我们获得了这些DTO并将它们转换为我们在Views中使用的ModelView。

这样我们将所有图层分开,而Web图层并不了解我们的模型图层。

我们使用AUtoMapper进行实体的所有映射 - > DTOs-> ModelViews

我的问题是,AutoMapper在Web层中运行良好,因为它接收DTO对象并将其转换为ModelView对象。

问题在于我们的服务层是否正在接收DynamicPrixies对象而不是Entity对象,因此AUtoMapper给我们一个错误:

var myEntity = Dbset.FirstOrDefault(p => p.Id == id); 
var myDto = Mapper.Map<LinkDto>(myEntity);

当然我们确实有适当的转换映射(我们尝试使用创建的Entity对象),我们无法设置ProxyCreationEnabled = false,因为我们在查询中使用了延迟加载。

我们正在使用最新版本的AutoMapper(5.0.2),我们正在创建这样的地图:

在Global.asax

Mapper.Initialize(
  cfg => {
                cfg.AddProfile(new AutoMapperWebProfile());
                cfg.AddProfile(new AutoMapperServiceProfile());
                cfg.IgnoreUnmapped(); 
         });

 Mapper.AssertConfigurationIsValid();

在Web项目中,我们有该项目的配置文件,在Service项目中,我们有另一个配置文件:

public AutoMapperServiceProfile()
{
    CreateMap<LinkDto, Link>().ReverseMap();
}

是否有任何解决方案:

A)将查询生成的DynamicProxy转换为Entity对象吗?

B)告诉AutoMapper读取那些DynamicProxies?

0 个答案:

没有答案