如何使用Automapper 6.1.1+映射EF动态代理对象?
解决Entity Framework动态代理对象的AutoMapper映射异常问题
我太懂你碰到的这个坑了——EF为了实现延迟加载、更改追踪这些功能,会返回动态代理对象(继承自你的Inquiry实体的子类),而AutoMapper默认在处理这种代理类型时容易出问题,哪怕你已经配置了Inquiry到JournalEntryInquiryVM的映射。
给你几个实用的解决方案,按需选择:
方案1:直接关闭EF动态代理(适合不需要延迟加载的场景)
如果你代码里不依赖延迟加载,可以在DbContext的构造函数里关掉代理创建:public YourDbContext() : base("YourConnectionString") { Configuration.ProxyCreationEnabled = false; Configuration.LazyLoadingEnabled = false; // 配套关闭延迟加载,避免后续潜在问题 }这样
InquiryLogic.Save()返回的就是纯Inquiry实体,映射时自然不会有异常。方案2:把代理对象转换为原始实体类型(保留EF功能的最优解)
不想放弃EF的动态代理功能?那就把返回的代理对象转成真正的Inquiry再映射:// 方式1:直接强制转换(简单粗暴,代理类本质是Inquiry的子类) var actualInquiry = (Inquiry)savedInquiry; return mapper.Map<JournalEntryInquiryVM>(actualInquiry); // 方式2:通过DbContext获取原始实体(更稳妥,适合复杂场景) var actualInquiry = yourDbContext.Entry(savedInquiry).Entity; return mapper.Map<JournalEntryInquiryVM>(actualInquiry);方案3:配置AutoMapper兼容代理对象
有时候代理类会自带一些额外属性,AutoMapper尝试映射这些未知属性时会报错。你可以全局配置忽略未知属性,或者在具体映射里明确规则:// 全局配置忽略所有未知属性 var mapperConfig = new MapperConfiguration(cfg => { cfg.IgnoreUnmapped(); cfg.CreateMap<Inquiry, JournalEntryInquiryVM>(); }); // 或者针对单个映射配置 CreateMap<Inquiry, JournalEntryInquiryVM>() .ForAllOtherMembers(opt => opt.Ignore());
内容的提问来源于stack exchange,提问作者xr280xr
相关产品推荐
相关产品推荐

