我正在使用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
员工时,我收到此错误:
{"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在这里引起任何问题。