【发布时间】:2020-07-07 05:18:18
【问题描述】:
我正在使用 Microsoft.AspNetCore.OData nuget v7.3.0 和 Microsoft.EntityFrameworkCore v3.1.1 开发新的 ASP.NET Core 3.1 API
我正在使用 Postman v7.21.0 来测试 API。
GET 和 POST 似乎一切正常,但使用 PATCH,我似乎只能更新字符串。如果我尝试更新作为 GUID 或 ENUM 的实体字段,它不会执行更新并且我不会收到任何类型的错误。
如果我在请求正文中使用以下 JSON 调用 HTTP PATCH;
{
"@odata.context": "https://localhost:44367/odata/$metadata#Account",
"AccountName": "Test Account 1"
}
增量正确更新 AccountName 字段,这是一个字符串。
但是,如果我在请求正文中使用以下 JSON 调用 HTTP PATCH;
{
"@odata.context": "https://localhost:44367/odata/$metadata#Account",
"OwnerId": "f9d1f8c7-2cbb-4156-0031-08d7d0f9edd5"
}
如果 OwnerID 是 GUID,我没有收到任何错误,但 OwnerId 值未在数据库中更新。
同样,如果我在请求正文中使用以下 JSON 调用 HTTP PATCH;
{
"@odata.context": "https://localhost:44367/odata/$metadata#Account",
"Status": "Inactive"
}
Status 是一个 ENUM,它也不会随更改更新数据库。
在我的元数据中,Status 列为 Type="MyApi.Enums.StatusTypes" 而 OwnerId 列为 Type="Edm.Guid"。
我需要在请求正文中包含类型吗?
我尝试了以下方法;
{
"@odata.context": "https://localhost:44367/odata/$metadata#Account",
"@odata.Type": "MyApi.Enums.StatusTypes"
"Status": "Inactive"
}
但它仍然没有更新数据库。
这是我的 API 中 Patch 方法的帐户控制器代码;
[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);
}
我在 OData.org 上找不到任何修补 GUID 或 ENUM 的示例。所有的数据修改示例都使用了字符串。
有什么想法吗?
我在这里错过了什么?
【问题讨论】:
标签: asp.net-core entity-framework-core odata postman