我一直在尝试将域对象映射到报表视图模型。在测试我伪造实体框架代码并使用构建器返回完全填充的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映射失败的地方。
任何建议。
答案 0 :(得分:7)
你的EF查询没有返回Gender,它返回一个代理,它可以在评估时为你获取性别,这不是AutoMapper构建一个映射来处理的类型。
您需要在查询中急切地获取性别,或者使用AutoMapper's IQueryable Extention的Project方法让AutoMapper发出匿名投影(同样在您的查询中),而不是尝试应用AutoMapping从EF上下文返回结果后。
这是一般的好习惯,以避免选择N + 1问题。
答案 1 :(得分:1)
我现在使用版本4.x遇到了同样的问题,恢复到3.3.1修复了问题。