簡體   English   中英

OData:更改 EDM Model 中實體類型的 URL 值

[英]OData: Change URL value for entity type in EDM Model

我正在使用 ASP.NET 核心 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 路由或導航屬性?

請在此處查看該文檔

長話短說 - OData URI 包括:

  • 服務根
  • OData 路徑
  • 查詢選項

例如。 這是一個通往 EntitySet“產品”的路徑,首先獲取,然后導航(請參閱導航屬性)到其供應商。

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

因此,您在根級別可訪問的所有內容都應該有自己的路徑,並且 / 告訴 Odata 從那里繼續導航。

因此,現在對於 OData,如果您將實體集路徑定義為可能與另一個實體集導航屬性混淆的東西,它將嚇壞大多數客戶端並且肯定是不好的風格。

但如果你真的需要這樣做,也許你可以通過定義自定義路由約定來實現。

但是不要! 只會惹麻煩

你想要一個導航屬性嗎?

如果您希望“Type”返回的集合依賴於 Vehicle,則應改為在 Vehicle 上定義導航屬性。

問候,邁克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM