OData:更改 EDM 模型中实体类型的 URL 值

OData: Change URL value for entity type in EDM Model

我正在使用 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。

有人遇到过这个问题吗?我确定这可能是解决此问题的某种方式。

Odata 路线或导航属性?

请查看该文档here

长话短说 - OData URI 包括:

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

例如。这是一个指向 EntitySet "Products" 的路径,首先获取,然后导航(请参阅导航属性)到其供应商。

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

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

所以,现在对于 OData,如果您将实体集路径定义为可能与另一个实体集导航混淆的东西,它会让大多数客户感到震惊,并且肯定是糟糕的风格 属性。

但是如果你真的需要这样做,也许你可以通过定义一个custom routing convention来实现它。

但是不要!只会惹事

你要导航吗属性?

如果您希望 "Type" returns 的集合依赖于 Vehicle,您应该在 Vehicle 上定义导航 属性。

你好,迈克