1

我正在使用一个 ASP.NET Core Web Api 项目,该项目将 OData 用于公开的端点,并与Simple.OData.Client一起使用。

我的一些端点是:

http://{baseUrl}/odata/Vehicle--> 这很完美

但是我对这两个有问题:

http://{baseUrl}/odata/Vehicle/Brand

http://{baseUrl}/odata/Vehicle/Type

基本上,我无法修改我的 EDM 模型来修改 OData 元数据中公开的 URL 属性。我的 EDM 看起来像这样:

private IEdmModel GetEdmModel()
{
    var odataBuilder = new ODataConventionModelBuilder();   

    odataBuilder.EntitySet<Vehicle>("Vehicle");
    odataBuilder.EntitySet<VehicleType>("VehicleType");
    odataBuilder.EntitySet<VehicleBrand>("VehicleBrand");

    return odataBuilder.GetEdmModel();
}

当我浏览时获得的元数据http://{baseUrl}/odata/如下:

{
    "@odata.context": "https://localhost:44332/odata/$metadata",
    "value": [
        {
            "name": "Vehicle",
            "kind": "EntitySet",
            "url": "Vehicle"
        },
        {
            "name": "VehicleType",
            "kind": "EntitySet",
            "url": "VehicleType"
        },
        {
            "name": "VehicleBrand",
            "kind": "EntitySet",
            "url": "VehicleBrand"
        }
    ]
}

我找不到保持名称不变的方法,但修改 JSON 上显示的“url”属性以指向我正确的端点。我想要这个结果:

    {
        "name": "VehicleBrand",
        "kind": "EntitySet",
        "url": "Vehicle/Brand"
    }

任何公开的EntitySetConfigurationODataConventionModelBuilder似乎有办法为已注册实体类型指定不同 URI 的任何方法。

有人遇到过这个问题吗?我相信这可能是解决这个问题的某种方法。

4

1 回答 1

1

Odata 路由或导航属性?

请在此处查看该文档

长话短说 - OData URI 包括:

  • 服务根
  • OData 路径
  • 查询选项

例如。这是一个通往 EntitySet“产品”的路径,首先获取,然后导航(请参阅导航属性)到其供应商。

https://example.com/odata/Products(1)/Supplier?$top=2
------------base---------|-----Path-----------?---options---

因此,您在根级别可访问的所有内容都应该有自己的路径,并且 / 告诉 Odata 从那里继续导航。

因此,现在对于 OData,如果您将实体集路径定义为可能与另一个实体集导航属性混淆的东西,它会吓坏大多数客户端并且肯定是不好的风格。

但如果你真的需要这样做,也许你可以通过定义自定义路由约定来实现。

但是不要!只会惹麻烦

你想要一个导航属性吗?

如果您希望“Type”返回的集合依赖于 Vehicle,则应改为在 Vehicle 上定义导航属性。

问候,迈克

于 2020-06-18T18:06:40.303 回答