2015-07-03 17 views
1

該方案是一個應用程序,它使用OData v4,基於使用ODataLib的實體框架模型的服務器端API,客戶端使用Visual Studio的OData客戶端代碼生成器擴展用於刪除m:m實體之間關係的OData屬性路由

我沒有得到的OData屬性的路由刪除關係的單位爲m實體工作:m關係,而客戶端生成DELETE形式要求:

http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish(1) 

屬性的路由POST創建鏈接工作得很好 - 相關的實體標識符編碼在正文中,以及以下c ontroller動作方法聲明工程(控制器本身具有[ODataRoutePrefix("tblTestRestaurant")]):

[ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpPost] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> PostAttachtblTestDishes([FromODataUri] int pRestaurantID, 
     [FromBody] Uri uri) { ... } 

但是,在使用中的URL $ref?id=...語法所確定的關聯實體的ID,我不能得到的東西類似的工作爲DELETE。

我曾嘗試使用ODataRoute屬性如下:

[ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef1([FromODataUri] int pRestaurantID, 
     [FromODataUri] Uri relatedUri) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef2([FromODataUri] int pRestaurantID, 
     [FromODataUri] string relatedUri) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref?$id={pRelated}")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef3([FromODataUri] int pRestaurantID, 
     [FromODataUri] string pRelated) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref?$id={pRelated}")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef4([FromODataUri] int pRestaurantID, 
     [FromODataUri] Uri pRelated) 
    { 
     throw new NotImplementedException(); 
    } 

但沒有上述控制器動作撞到響應DELETE請求http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish(1)

我能得到它的工作的唯一方法是不使用屬性的路由,而是依賴於OData的路由約定,即

[HttpDelete] 
    public async Task<IHttpActionResult> DeleteRef([FromODataUri] int key, 
     [FromODataUri] string relatedKey, string navigationProperty) 
    { 
     throw new NotImplementedException(); 
    } 

這種方法依賴於測試串navigationProperty制定出哪個集合導航對實體進行修改的屬性 - 相反,我更願意使用屬性路由併爲每個集合導航屬性在我的控制器中有一個單獨的操作方法。

我已經使用特別https://damienbod.wordpress.com/2014/06/10/getting-started-with-web-api-and-odata-v4/

我也已經通過一些的OData的WebAPI測試用例,一些教程和文檔特別this one其使用屬性路由和路由的OData約定的混合物 - 但沒有按不包含用於刪除鏈接的屬性路由示例。

所以我的問題是 - 我應該使用什麼ODataRoute屬性語法和方法參數,假設ODataRoute屬性支持這個... $ ref?id = ...在刪除的URL中的語法;如果沒有,那麼還有什麼替代方案?

回答

1

Web API OData在$Id中解析URI以創建附加到原始路徑段的密鑰段。所以,如果你改變如下的模板,它應該工作:

[ODataRoute("({pRestaurantID})/tblTestDishes({pRelated})/$ref")] 
[HttpDelete] 
public async Task<IHttpActionResult> TestRemoveRef([FromODataUri] int pRestaurantID, [FromODataUri] int pRelated) 
{ 
     ... 
} 

你可以參考我的樣本項目here。希望它能幫助你。謝謝。

+0

您的模板確實可行,Thanks.But $ id是否可以添加參考場景? – user1729842

+0

什麼是添加參考場景?你的意思是「郵報」? –

+0

這很好,非常感謝。另外,是否有任何一種調試工具可以用來確定OData如何翻譯傳入的請求 - 也就是說,我可以爲其他場景制定路線屬性應該是什麼? – stebay