Как реализовать OData Core с асинхронным ожиданием? - PullRequest
0 голосов
/ 06 февраля 2019

Я внедряю OData для личного проекта.На данный момент у меня есть этот код

    [HttpPost]
    [ODataRoute("Classes", RouteName = "PostClass")]
    public IActionResult PostClass([FromBody] Class @class)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        @class.Id = Guid.NewGuid();
        _context.Classes.Add(@class);
        _context.SaveChangesAsync();

        //return CreatedAtAction("GetClass", new { id = @class.Id }, @class);
        return Created(@class);
    }

Он работает нормально, но я хотел бы, если бы я мог улучшить его с системой Sync Awit, как это:

    [HttpPost]
    [ODataRoute("Classes", RouteName = "PostClass")]
    public async Task<ActionResult<Class>> PostClass([FromBody] Class @class)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        @class.Id = Guid.NewGuid();
        _context.Classes.Add(@class);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetClass", new { id = @class.Id }, @class);
        //return Created(@class);
    }

Когда я делаю эту секундурешение построить код, но я получаю 500 Внутренняя ошибка сервера.

С

    [HttpPost]
    [ODataRoute("Classes", RouteName = "PostClass")]
    public async Task<ActionResult<Class>> PostClass([FromBody] Class @class)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        @class.Id = Guid.NewGuid();
        _context.Classes.Add(@class);
        await _context.SaveChangesAsync();

        //return CreatedAtAction("GetClass", new { id = @class.Id }, @class);
        return Created(@class);
    }

Код не может быть создан, потому что

Код серьезности Описание Подавление строки файла проектаОшибка состояния CS0029 Невозможно неявно преобразовать тип «Microsoft.AspNet.OData.Results.CreatedODataResult» в «Microsoft.AspNetCore.Mvc.ActionResult» Oyg.Api C: \ Users \ Public \ Projects \ oyg-server \ Api \ Controllers \ ClassesController.cs 96 Active

Хорошо, ясно, но тогда какой метод я должен использовать вместо Created ()?

1 Ответ

0 голосов
/ 07 февраля 2019

Это потому, что тип CreatedODataResult , возвращаемый методом Created<TEntity>(entity) , не является подклассом ActionResult, но класс, который реализует интерфейс IActionResult :

public class CreatedODataResult<T> : IActionResult
{
    // ...
}

Чтобы исправить свой код, просто измените Task<ActionResult<Class>> на Task<IActionResult>:

    [HttpPost]
    [ODataRoute("Classes", RouteName = "PostClass")]
    public async Task<IActionResult> PostClass([FromBody] Class @class)
    {
        // ...
        return Created(@class);
    }
...