2016-05-16 88 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