asp. net core 2.1 odata использует другое имя объекта в маршруте - PullRequest
0 голосов
/ 30 мая 2020

У меня есть длинное имя объекта в моем коде EmployeTraining, который используется как объект в OData и с таким же именем для контроллера.

Startup.cs

 app.UseMvc(routeBuilder=>
        {                
            routeBuilder.Expand().Select().Count().OrderBy().Filter().MaxTop(null);
            routeBuilder.MapODataServiceRoute("EmployeTraining", "odata/v1", EdmModelBuilder.GetEdmModelEmploye());

        });


EdmModelBuilder.cs

public static IEdmModel GetEdmModelEmployes()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<EmployeTraining>("EmployeTraining");            
        return builder.GetEdmModel();
    }

EmployeTrainingControllers.cs

public class EmployeTrainingController : ODataController
{
    internal IEmployeService ServiceEmploye { get; set; }

    public EmployesController(IEmployeService serviceEmploye)
    {

        ServiceEmploye = serviceEmploye;
    }

    //// GET api/employes
    [HttpGet]
    [MyCustomQueryable()]
    public IQueryable<EmployeTraining> Get()
    {

        return ServiceEmploye.GetListeEmployes();
    }
}

Для вызова моей службы он работает только через этот URL: https : // {server} / odata / v1 / rh / employeeetraining

, но мне нужно использовать этот https: // {server} / odata / v1 / rh / employee-training любая помощь, пожалуйста.

Ответы [ 2 ]

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

Для такого сценария измените, как показано ниже:

1. Измените имя набора сущностей:

public static class EdmModelBuilder
{
    public static IEdmModel GetEdmModelEmployes()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<EmployeTraining>("employe-training");
        return builder.GetEdmModel();
    }
}

2. Добавьте атрибут:

public class EmployeTrainingController : ODataController
{
    [HttpGet]
    [ODataRoute("employe-training")]
    //[MyCustomQueryable()]
    public IQueryable<EmployeTraining> Get()
    {

         return ServiceEmploye.GetListeEmployes();
    }
}

3. Startup.cs:

app.UseMvc(routeBuilder=>
{                
     routeBuilder.Expand().Select().Count().OrderBy().Filter().MaxTop(null);
     routeBuilder.MapODataServiceRoute("EmployeTraining", "odata/v1/rh", EdmModelBuilder.GetEdmModelEmploye());

});

Запросить URL: https://{server}/odata/v1/rh/employe-training

0 голосов
/ 30 мая 2020

Причина, по которой работает https://{server}/odata/v1/rh/employetraining, заключается в том, что это метод Get контроллера EmployeTrainingController.

Вы сможете изменить это поведение, если измените [HttpGet] на Get метод до [HttpGet("employe-training")]

...