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

时间:2014-05-19 20:40:52

标签: c# entity-framework ef-code-first odata

我正在使用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实体。

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

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

是否可以将ModifiedDate作为主键保留,但在我的请求中不需要它?

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决此问题:

  1. 向此网址发送GET请求: / odata / QuizAnswerHistory?$ filter = StudentId eq 1和QuestionId eq 2
  2. 使用OData功能,但您需要从OData v3升级到v4,其中DateTime类型将替换为DateTimeOffset。有关函数示例,请参阅:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataFunctionSample/