【问题标题】:Automapper, MapFrom and EF dynamic proxiesAutomapper、MapFrom 和 EF 动态代理
【发布时间】:2016-12-08 21:47:11
【问题描述】:

我一直在尝试将我的域对象映射到报表视图模型。在我伪造实体框架代码并使用构建器返回完全填充的 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;

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

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

任何建议。

【问题讨论】:

  • DynamicMap 使用个人资料吗?
  • 我是 Automapper 的新手,所以我不确定。我想它会像预期的那样填充联系人的其余属性
  • 我可能弄错了,但我认为 DynamicMap 无论如何都可以工作。你试过普通的Map()吗?
  • 是的,我收到“缺少类型映射配置或不支持的映射”异常
  • 你绝对是在正确的轨道上。一旦我调用了 AutoMapperConfigurator.Configure() 方法,一切都很好。

标签: c# entity-framework automapper


【解决方案1】:

您的 EF 查询没有返回 Gender,它返回的 Proxy 可以在评估时为您获取 Gender,这不是 AutoMapper 构建要处理的映射的类型。

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

一般来说,这是避免 Select N+1 问题的良好做法。

【讨论】:

  • 感谢您的建议。我接受了这个作为答案,但最终证明这是我的一个简单错误。我创建了一个带有 AutoMapperConfigurator.Configure() 的 Bootstrap 方法,只是忘记在我的代码中调用该方法。 :(
  • 啊。那也可以。通常 Automapper 可以很好地处理子类,我认为您的代码中有一些东西阻止了这种情况。无论哪种方式,最好在查询方法中映射并返回所需的类型,而不是在查询方法返回的类上。
【解决方案2】:

我现在在 4.x 版本中遇到了同样的问题,恢复到 3.3.1 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多