簡體   English   中英

將新實體過帳到沒有ID的Web.API OData端點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM