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

本文关键字:服务器 错误 ref Api oData v4 Web | 更新日期: 2024-09-21 03:07:05

问题

我能够使用以下方法成功地从这段关系的任何一端获取相关项目:

  • http://localhost/api/Exercises(1) $expand=测量
  • http://localhost:49540/api/Exercises(1)/测量

现在我正在努力处理他们之间的关系。我在那里发现了一些我尝试过的例子,但都不起作用。这是一个,这是另一个。

型号

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)/测量$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);
    }

URL:无

结果:服务器错误: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})'.

相关

这家伙也有同样的症状,在微软发布修复程序后,他得以解决。我正在使用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" />

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

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

根据本文档底部的删除实体之间的关系,我的URL应该如下所示:

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

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

MS需要认真修复和改善CDS的用户体验,或者干脆放弃Fing的东西。十多年来,这一直是一场愚蠢的噩梦。