在url中没有组合主键部分的OData请求

本文关键字:键部 OData 请求 组合 url | 更新日期: 2023-09-27 18:04:02

我正在使用EF6 Code First编写应用程序,并通过OData端点公开我的实体。我有一个本质上的变化跟踪实体,它跟踪另一个实体之前的所有值;类似以下内容:

public class QuizAnswerHistory
{
    [Key]
    public int StudentId { get; set; }
    [Key]
    public int QuestionId { get; set; }
    [Key]
    public DateTime ModifiedDate { get; set; }
    public string AnswerValue { get; set; }
}

我还有一个QuizAnswer实体,它具有完全相同的属性,除了它的复合主键不包括ModifiedDate。仅引用Student实体和Question实体。

现在,因为我希望能够获得特定Student/Question的整个QuizAnswerHistory实体,所以我不想在OData请求中指定ModifiedDate

然而,因为ModifiedDate是一个主键,当我向/odata/QuizAnswerHistory(StudentId=1,QuestionId=2)发送GET请求时,我得到了错误,"传递的主键值的数量必须与实体上定义的主键值的数量匹配。"

是否有可能保持ModifiedDate为主键,但不需要它在我的请求?

在url中没有组合主键部分的OData请求

有两个选项可以解决这个问题:

  1. 发送GET请求到这个URL:/odata/QuizAnswerHistory吗?$filter=StudentId eq 1 and QuestionId eq 2
  2. 使用OData Function特性,但需要从OData v3升级到v4,其中DateTime类型被替换为DateTimeOffset。有关功能示例,请参考:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataFunctionSample/