【问题标题】:OData: Change URL value for entity type in EDM ModelOData:更改 EDM 模型中实体类型的 URL 值
【发布时间】:2020-10-06 13:16:55
【问题描述】:

我正在处理一个 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。

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

【问题讨论】:

    标签: asp.net-core odata simple.odata.client


    【解决方案1】:

    Odata 路由或导航属性?

    请查看该文档here

    长话短说 - OData URI 包含:

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

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

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

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

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

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

    但不要!只会惹麻烦

    您想要导航属性吗?

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

    你好,迈克

    【讨论】:

    • 嗨,迈克,我在没有导航属性的情况下解决了你建议的问题。我没有“RESTify”我的端点,而是为所有端点定义了一个路由键,例如,Vehicle/Type 就变成了 VehicleType,这就是我在 EDM 模型中声明它的方式。感谢您的回答,除非有人建议做得更好,否则这可能是解决问题的最佳方法。
    • 这是正确的方法,也是默认路由约定。你不会错的
    猜你喜欢
    • 2021-11-15
    • 2020-07-22
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多