Я работаю над новым 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. Во всех примерах модификации данных используются строки.
Есть идеи?
Что мне здесь не хватает?