我正在使用 Web API 构建 OData 服务。数据库访问是通过实体框架处理的。
我正在使用 AutoMapper 将我的 EF 实体映射到另一组类。这些映射的类是通过 OData 服务公开的。
我有一个看起来像这样的模型:
Assignment(int AssignmentId, int EmployeeId, Employee Employee)
Employee(int EmployeeId, ICollection<Skill> Skills)
Skill(int SkillId, string SkillName)
我的 OData 端点公开了一个IQueryable<Assignment>
. 一切都适用于简单的 OData 查询(、、、$top
等$select
)$filter
。默认情况下,Assignment.Employee
不从服务返回;我对此很好。
当我尝试$expand
Employee 时,我收到此错误:
{"error":{"code":"","message":"An error has occurred.","innererror":{"message":"Cannot compare 'member 'Skills' of type '[...].Employee''. Only primitive types, enumeration types and entity types are supported.","type":"System.NotSupportedException"[...]}
[...]
实际上并不是错误的一部分,只是我删除的消息的一部分。
在这一点上,我还没有要求Skills
,我的期望是Employee.Skills
不会扩大,因为我没有明确要求扩大它。我不确定与之Skills
相比的是什么让 EF 被淘汰。
我能说的最好的一点是,OData 在我应用的任何投影之上应用了一个额外的投影,而 EF 遇到的问题就是这个投影。
有没有人使用 OData/EF 来导航具有不止一层深度的属性的经验/成功?
我曾尝试删除 AutoMapper 并手动编写表达式,但我仍然遇到同样的错误,所以我不相信 AutoMapper 在这里造成任何问题。