Asp.net web api 用于删除m:m实体之间关系的OData属性路由
该场景是一个应用程序,它使用OData v4,服务器端API基于使用ODataLib的实体框架模型,客户端使用用于Visual Studio的OData客户端代码生成器扩展 我无法使OData属性路由用于删除m:m关系中实体的关系,客户机将为其生成以下形式的删除请求: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
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)
{
...
}