2016-05-16 102 views
1

我使用Visual Studio 2015 Web API 2项目和脚手架控制器(“Microsoft OData V4 Web API控制器使用实体框架”脚手架)创建了一个非常原始的OData webservice。OData V4属性访问

我只有一个实体在我的模型中设置:“书籍”。 “Book”实体具有特权“标题”字符串属性。

我推测脚手架控制器将服务于所有合法的OData v4请求,但似乎并非如此?

http://localhost:xxxx/OData/Books作品(枚举所有属性的所有书籍 - 包括“名称”属性)

http://localhost:xxxx/OData/Books(1)作品(列举了第一本书的所有属性,包括“标题”属性)

http://localhost:xxxx/OData/Books(1)/Title做不起作用 - 我得到一个“尽管请求是100%OData v4投诉,但没有发现路由约定为模板'〜/ entityset/key/property'错误选择OData路径的操作?

它为什么不起作用?它不应该工作吗?需要什么才能使其工作?

回答

2

脚手架确实是而不是创建一个控制器,服务于所有合法的OData v4请求。

要检索图书实体的Title属性,则必须按如下方法添加到BooksController

public string GetTitleFromBook([FromODataUri] int key) 
{ 
    // Put appropriate method logic here. 
} 

请参阅“查询导航属性”和“属性”表中Routing Conventions in ASP.NET Web API 2 Odata

此外,请考虑使用$select query option来限制为响应实体的正常请求而获得的属性。例如:

GET http://localhost:xxxx/OData/Books(1)?$select=Title 
+0

非常感谢您的链接 - 现在我想我明白了。是否正确地说,为了处理对一个实体的任何单一属性的请求,该实体的控制器必须实现一个单独的专门操作方法,形式为“Get From (...) “为每一个可用的财产? –

+0

是的,只要你在实体属性中使用内置的路由约定。作为替代方案,您可以编写自己的路由约定,该约定支持将属性名称作为字符串传递给控制器​​方法,但这要做得更多。 – lencharest