保存后,我正在尝试将实体框架模型映射到视图模型。
//Map my incoming VM to a DTO and save it
Inquiry savedInquiry = InquiryLogic.Save(mapper.Map<InquirySpec>(inquiryVM));
//Map the returned Inquiry back to a VM and return it
return mapper.Map<JournalEntryInquiryVM>(savedInquiry);
我可以成功地将查询映射到JournalEntryInquiryVM
,但是当我尝试将savedInquiry
映射回JournalEntryInquiryVM
时,我得到以下异常,因为它实际上不仅仅是一个Inquiry
,它是由实体框架创建的动态代理:
缺少类型映射配置或不受支持的映射。
映射类型: Inquiry_66DF1FFF68CAC6E17FC0F72D753A523B9CCF3AFA55E82C2B5B910A95B0BFCC79 -> 日志条目查询VM System.Data.Entity.DynamicProxies.Inquiry_66DF1FFF68CAC6E17FC0F72D753A523B9CCF3AFA55E82C2B5B910A95B0BFCC79 -> TLGI。客户关系管理。MVCWeb.ViewModels.CustomerAccounts.JournalEntryInquiryVM
此时,在代码中,我的 DbContext 已释放,并且我已经检索了所需的任何导航属性。我只需要它来进行映射,就好像它只是一个查询一样。
看起来这在旧版本的 AutoMapper 中是可能的,但我在 StackOverflow 或 Automapper wiki 上找不到任何关于版本 6.1.1(这是我正在使用的版本)或更高版本的答案。AutoMapper变化如此之大,以至于很难找到任何相关的东西。
使用AutoMapper的IQueryable Extensionion
-
如果要从可查询的代理获取 DTO:
mapper.ProjectTo<TDest>(sourceQueryable)
会帮助你。 -
如果要从代理实体获取 DTO 对象:
mapper.ProjectTo<TDest>(new[] { source }.AsQueryable()).Single()
在您的情况下,JournalEntryInquiryVM
是TDest
,savedInquiry
是source
。