Web Api oData v4 $ ref 404或服务器错误

时间:2016-04-17 15:54:42

标签: c# asp.net asp.net-web-api odata

问题

我可以使用以下方法从此关系的任一端成功获取相关项目:

现在我正在尝试管理它们之间的关系。我发现有一些例子,我已经尝试过但都没有用。 Heres oneheres another

模型

public class Exercise
{
    public int Id { get; set; }
    public virtual ICollection<Measurement> Measurements { get; set; }
}

public class Measurement
{
    public int Id { get; set; }
    public virtual ICollection<Exercise> Exercises { get; set; }
}

操作

以下是我尝试过的行动及其要求:

[HttpDelete]
public IHttpActionResult DeleteRef([FromODataUri] int key, [FromODataUri] string relatedKey, string navigationProperty)
{
   return StatusCode(HttpStatusCode.NoContent);
}

网址:http://localhost/api/Exercises(1)/Measurements $ id = http://localhost/api/Measurements(4)

结果:404

[HttpDelete]
[ODataRoute("Exercises({key})/Measurements({relatedKey})/$ref")]
public IHttpActionResult DeleteMeasurementFromExercise(int key, int relatedKey)
{
   return StatusCode(HttpStatusCode.NoContent);
    }

网址:不适用

结果:服务器错误:The path template 'Exercises({key})/Measurements({relatedKey})/$ref' on the action 'DeleteMeasurementFromExercise' in controller 'Exercises' is not a valid OData path template. The URI segment '$ref' is invalid after the segment 'Measurements({relatedKey})'.

相关

This guy具有相同的症状,并且能够在Microsoft发布修复程序后解决此问题。我正在运行最新版本的Web API和oData,但仍然存在这个问题。

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.OData" version="5.9.0" targetFramework="net46" />
<package id="Microsoft.OData.Core" version="6.15.0" targetFramework="net46" />
<package id="Microsoft.OData.Edm" version="6.15.0" targetFramework="net46" />

2 个答案:

答案 0 :(得分:1)

像往常一样,在向SO发布问题后几分钟,问题的答案我会坚持几天。

根据this documentation底部的删除实体之间的关系,我的网址应如下所示:

DELETE http://host/Suppliers(1)/Products/$ref?$id=http://host/Products(1)

这样的行动:

public IHttpActionResult DeleteRef([FromODataUri] int key, [FromODataUri] string relatedKey, string navigationProperty)
{
    return StatusCode(HttpStatusCode.NoContent);
}

文档错误。经过一番挖掘,我发现你的网址应该是这样的:

DELETE http://host/Suppliers(1)/Products(2)/$ref

答案 1 :(得分:0)

我很痛苦地发现,可以更早地解决此问题的另一件事是,检查从全局发现URL检索到的实体元数据文件。它将在关系的任一端都包括两个实体,以及用于多对多关系的任何联接表。这将为您提供用于每个对象的有效名称。

MS需要认真修复和改善CDS的用户体验,或者只是放弃Fing。十多年来,这一直是一场沉闷的噩梦。