我正在使用 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 });