将新实体发布到没有 ID 的 Web.API OData 终结点



我正在使用 ASP.NET Core 2.1,Web.API和OData(7.0.0-beta4(构建概念验证API。

我的一个 OData 终结点负责对Employer实体执行基本 CRUD 操作。POST终结点(创建全新的Employer记录(定义如下:

// POST: api/Employers
[HttpPost]
public async Task<IActionResult> PostEmployer([FromBody] Employer employer)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
_context.Employers.Add(employer);
await _context.SaveChangesAsync();
return CreatedAtAction("GetEmployer", new { id = employer.Id }, employer);
}

我的Employer实体定义如下:

namespace MyProject.Models
{
public class Employer
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}
}

如果我使用如下所示的POST体命中此 OData 终结点:

{
"Name": "My Employer",
"IsActive": true
}

我收到一条错误消息:

InvalidOperationException: No route matches the supplied values.

这是因为Id属性是必需的,但在我的 JSON 中没有提供。 但是,我不想提供Id属性,因为此属性将由数据库自动生成。 如果我确实提供了Id属性,则我的请求已成功路由,但在该过程的后期收到实体框架错误 (Cannot insert explicit value for identity column(,这是有道理的。

如何使 OData 终结点在POST请求期间忽略所需的Id属性?

尝试将 [DataContract] 和 [DataMember] 属性添加到您的雇主模型中:

[DataContract]
public class Employer
{
[DataMember(Name = "Id", IsRequired=false, EmitDefaultValue=false)]
public int Id { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
}

有关 DataMemberAttribute 属性的详细信息:https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute_properties(v=vs.110(.aspx

想通了 - 事实证明这个问题与我的实体类中的Id属性无关。 相反,问题是这一行:

return CreatedAtAction("GetEmployer", new { id = employer.Id }, employer);

框架必须对指定的操作("GetEmployer"(进行某种验证,并且它抛出了一个错误,表明此操作无效。

我不确定如何更正此字符串值,但我可以通过使用更简单的返回值来完全避免这个问题:

return Ok(new { Id = employer.Id });

最新更新