Automapper,MapFrom和EF动态代理

时间:2014-08-26 13:36:42

标签: c# entity-framework automapper

我一直在尝试将域对象映射到报表视图模型。在测试我伪造实体框架代码并使用构建器返回完全填充的pocco对象时,一切都运行良好。现在我实际上正在访问数据库并返回数据,我看到了一些奇怪的动态代理类型错误。

以下是我的代码示例:

public class ContactMapping  : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<Contact, ReportRowModel>()
             .ForMember(dest => dest.Gender, opt => opt.MapFrom(src => src.Gender.Name));

    }

}

映射代码如下:

var contact = GetContactFor(clientPolicy);
Mapper.DynamicMap(contact, rowModel);
return rowModel;

除正在返回的rowModel.Gender字段外,所有联系人字段都正确填充System.Data.Entity.DynamicProxies.Gender_3419AAE86B58120AA2983DA212CFFEC4E42296DA14DE0836B3E25D7C6252EF18

我见过人们在使用Map而不是DynamicMap时遇到问题的解决方案,但是我还没有发现.ForMember映射失败的地方。

任何建议。

2 个答案:

答案 0 :(得分:7)

你的EF查询没有返回Gender,它返回一个代理,它可以在评估时为你获取性别,这不是AutoMapper构建一个映射来处理的类型。

您需要在查询中急切地获取性别,或者使用AutoMapper's IQueryable Extention的Project方法让AutoMapper发出匿名投影(同样在您的查询中),而不是尝试应用AutoMapping从EF上下文返回结果后。

这是一般的好习惯,以避免选择N + 1问题。

答案 1 :(得分:1)

我现在使用版本4.x遇到了同样的问题,恢复到3.3.1修复了问题。