OData: изменение значения URL-адреса для типа объекта в модели EDM - PullRequest
0 голосов
/ 16 июня 2020

Я работаю с проектом ASP. NET Core Web Api, который использует OData для открытых конечных точек и использует Simple.OData.Client .

Некоторые из моих конечных точек:

http://{baseUrl}/odata/Vehicle -> это отлично работает

Но у меня проблемы с этими двумя:

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

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

По сути, я не могу изменять свои модели EDM для изменения свойства URL, которое отображается в метаданных OData. Мой 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"
        }
    ]
}

Я не смог найти способ сохранить имя как есть, но измените свойство «url», показанное на JSON, чтобы оно указывало на мою правильную конечную точку. Мне нужен такой результат:

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

Любой из методов, представленных в EntitySetConfiguration или ODataConventionModelBuilder, похоже, имеет способ указать другой URI для зарегистрированного типа объекта.

Кто-нибудь сталкивался с этой проблемой? Я уверен, что это может быть способ решить эту проблему.

1 Ответ

1 голос
/ 18 июня 2020

Маршрут Odata или свойство навигации?

Пожалуйста, ознакомьтесь с этой документацией здесь

Короче говоря - URI OData состоит из :

  • Сервис root
  • Путь OData
  • Параметры запроса

Например. Это путь, который ведет к EntitySet «Products», берет первый и затем переходит (см. Свойства навигации) к его поставщику.

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

Итак, все, что вы делаете доступным на уровне root, должно иметь свой собственный путь, и /, сообщающий Odata, что нужно перемещаться оттуда.

Итак, теперь для OData это это напугало бы большинство клиентов и, конечно, было бы плохим стилем, если бы вы определили путь наборов сущностей как что-то, что можно спутать с другим свойством навигации набора прав.

Но если вам ДЕЙСТВИТЕЛЬНО нужно это сделать, возможно, вы сможете достичь этого, определив соглашение о пользовательской маршрутизации .

Но не надо! Это только вызовет проблемы.

Хотите свойство навигации?

Если вы хотите, чтобы набор, возвращаемый «Тип», зависел от транспортного средства, вы должны определить вместо этого свойство навигации на Транспортном средстве.

Привет, Майк

...