1

我正在使用 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不从服务返回;我对此很好。

当我尝试$expandEmployee 时,我收到此错误:

{"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 在这里造成任何问题。

4

0 回答 0