[英]POST-ing a new entity to a Web.API OData endpoint without an ID
我正在使用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
屬性,則我的請求已成功路由,但稍后在處理過程中出現Entity Framework錯誤( 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/zh-cn/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 });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.