Asp.net web api 用于删除m:m实体之间关系的OData属性路由

Asp.net web api 用于删除m:m实体之间关系的OData属性路由,asp.net-web-api,odata,odata-v4,odatalib,odatacontroller,Asp.net Web Api,Odata,Odata V4,Odatalib,Odatacontroller,该场景是一个应用程序,它使用OData v4,服务器端API基于使用ODataLib的实体框架模型,客户端使用用于Visual Studio的OData客户端代码生成器扩展 我无法使OData属性路由用于删除m:m关系中实体的关系,客户机将为其生成以下形式的删除请求: http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish

该场景是一个应用程序,它使用OData v4,服务器端API基于使用ODataLib的实体框架模型,客户端使用用于Visual Studio的OData客户端代码生成器扩展

我无法使OData属性路由用于删除m:m关系中实体的关系,客户机将为其生成以下形式的删除请求:

http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish(1)
用于创建链接的POST属性路由工作正常-相关实体标识符编码在正文中,以下控制器操作方法声明工作正常(控制器本身具有
[ODataRoutePrefix(“tblTestRestaurant”)]
):

但上述控制器操作都不会响应
http://developer4:8080/odata/tblTestRestaurant(241)/TBLTestdisks/$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();
    }
[HttpDelete]
公共异步任务DeleteRef([FromODataUri]int键,
[FromODataUri]字符串相关键,字符串导航属性)
{
抛出新的NotImplementedException();
}
此方法依赖于测试string navigationProperty来确定要修改实体上的哪个集合导航属性-相反,我更喜欢使用属性路由,并在控制器中为每个集合导航属性使用单独的操作方法

我特别使用了一些教程和文档

我还看过一些ODataWebAPI测试用例,特别是它混合使用属性路由和OData路由约定,但没有包含用于删除链接的属性路由示例


所以我的问题是-假设ODataRoute属性确实支持这个…$ref?id=…,我应该使用什么ODataRoute属性语法和方法参数。。。URL中用于删除的语法;如果没有,那么还有什么替代方案?

Web API OData解析
$Id
中的Uri,以创建附加到原始路径段的键段。因此,如果您按以下方式更改模板,它应该可以工作:

[ODataRoute("({pRestaurantID})/tblTestDishes({pRelated})/$ref")]
[HttpDelete]
public async Task<IHttpActionResult> TestRemoveRef([FromODataUri] int pRestaurantID, [FromODataUri] int pRelated)
{
        ...
}
[ODataRoute(({pRestaurantID})/tbltestdiscles({pRelated})/$ref”)]
[HttpDelete]
公共异步任务TestRemoveRef([FromODataUri]int-pRestaurantID,[FromODataUri]int-pRelated)
{
...
}

您可以参考我的示例项目。希望它能帮助你。谢谢。

您的模板确实有效,谢谢。但是$id在添加引用场景时有效吗?添加引用场景是什么?你是说“发帖”?这很有效,非常感谢。顺便问一下,有没有什么调试工具可以用来确定OData是如何翻译传入的请求的?也就是说,这样我就可以在其他情况下确定路由属性应该是什么?@stebay,不客气。对于调试,很抱歉没有这样的工具。但是,ODataTeam将这些符号与nugget软件包一起发布。因此,通过设置
http://srv.symbolsource.org/pdb/Public
http://srv.symbolsource.org/pdb/MyGet
进入您的符号文件搜索位置。
    [HttpDelete]
    public async Task<IHttpActionResult> DeleteRef([FromODataUri] int key,
        [FromODataUri] string relatedKey, string navigationProperty)
    {
        throw new NotImplementedException();
    }
[ODataRoute("({pRestaurantID})/tblTestDishes({pRelated})/$ref")]
[HttpDelete]
public async Task<IHttpActionResult> TestRemoveRef([FromODataUri] int pRestaurantID, [FromODataUri] int pRelated)
{
        ...
}