Как пропатчить нумерацию и направляющие с помощью OData V4 Delta в Asp. Net .Core 3.1 - PullRequest
0 голосов
/ 26 марта 2020

Я работаю над новым ASP. NET Core 3.1 API с использованием Microsoft.AspNetCore.OData nuget v7.3.0 и Microsoft.EntityFrameworkCore v3.1.1

Я использую Postman v7.21.0 для тестирования API.

Кажется, все работает хорошо GET и POST, но с PATCH я, кажется, могу только обновлять строки. Если я пытаюсь обновить поле сущности, которое является GUID или ENUM, оно не выполняет обновление, и я не получаю никакой ошибки.

Если я вызываю HTTP PATCH со следующим JSON в теле запроса;

{
    "@odata.context": "https://localhost:44367/odata/$metadata#Account",
    "AccountName": "Test Account 1"
}

Дельта корректно обновляет поле AccountName, которое является строкой.

Однако, если я вызываю HTTP PATCH со следующим JSON в теле запроса;

{
    "@odata.context": "https://localhost:44367/odata/$metadata#Account",
    "OwnerId": "f9d1f8c7-2cbb-4156-0031-08d7d0f9edd5"
}

Где OwnerID является GUID, я не получаю никакой ошибки, но значение OwnerId не обновляется в база данных.

Аналогичным образом, если я вызову HTTP PATCH со следующим JSON в теле запроса;

{
    "@odata.context": "https://localhost:44367/odata/$metadata#Account",
    "Status": "Inactive"
}

Там есть состояние ENUM, оно также не будет обновлять базу данных с изменением ,

В моих метаданных Статус отображается как Type = "MyApi.Enums.StatusTypes", а OwnerId - как Type = "Edm.Guid".

Нужно ли включать Введите тело моего запроса?

Я попробовал следующее;

{
    "@odata.context": "https://localhost:44367/odata/$metadata#Account",
    "@odata.Type": "MyApi.Enums.StatusTypes" 
    "Status": "Inactive"
}

Но он все равно не обновил базу данных.

Вот мой код контроллера учетных записей для Метод исправления в моем API;

    [ODataRoute("{id}")]
    [Produces("application/json;odata.metadata=minimal")]
    [ProducesResponseType(typeof(AccountModel), Status200OK)]
    [ProducesResponseType(Status204NoContent)]
    [ProducesResponseType(Status400BadRequest)]
    [ProducesResponseType(Status404NotFound)]
    public async Task<IActionResult> Patch(Guid id, [FromBody] Delta<Account> delta)
    {

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var entity = await _context.Accounts.FindAsync(id);
        if (entity == null)
        {
            return NotFound();
        }

        delta.Patch(entity);
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (RecordExists(id))
            {
                return NotFound();
            }
            throw;
        }

        return Updated(delta);
    }

Я не смог найти примеры исправления GUID или ENUM на OData.org. Во всех примерах модификации данных используются строки.

Есть идеи?

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 07 апреля 2020

@ whiskytangofoxtrot Предполагая, что вы обращаетесь к своему сервису от Почтальона (или его эквивалента), просим вас обязательно включить примечание типа Enum в полезную нагрузку. Как указано ниже:

{
    "@odata.context": "{{ServiceRoot}}/$metadata#Accounts/$entity",
    "Id": "3527ba9a-f5aa-4337-b7bb-dfe634b15e57",
    "OwnerId": "3527ba9a-f5aa-4337-b7bb-dfe634b15e57",
    "Status@odata.type": "#NS.AccountStatus",
    "Status": "InActive"
}

Замените NS и {{ServiceRoot}} на пространство имен и службу root (соответственно), указав c для вашего сценария. Что касается Guid, вам не нужно ничего делать, например c.

Найти скриншоты моей успешной попытки: Запрос: enter image description here

Результат: enter image description here

...