簡體   English   中英

在帶有 Entity Framework Core 的 ASP.NET Core WebAPI 的 PUT 方法中進行此檢查的目的是什么?

[英]What is the purpose of this check in this PUT method of ASP.NET Core WebAPI with Entity Framework Core?

我有一個帶有 Entity Framework Core 的 ASP.NET Core WebAPI 應用程序。

我有以下 model class:

public class Item
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

    [Required(ErrorMessage = "You must provide a name.")]
    [MaxLength(255)]
    public string Name { get; set; }
}

並搭建了一個“API Controller with actions, using Entity Framework”,它有以下方法:

    [HttpPut("{id}")]
    public async Task<IActionResult> PutItem(long id, Item item)
    {
        if (id != item.Id)
        {
            return BadRequest();
        }

        _context.Entry(item).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!ItemExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

我不明白if (id.= item.Id)檢查。 Id屬性設置為DatabaseGenerated ,因為我希望它是我的主鍵,自動遞增且不由客戶端提供,因此客戶端只需 PUT a {"name":"item1"} object 即可成功。

那么為什么會有這張支票呢? 這是自動代碼生成器的故障嗎? 我可以安全地刪除它嗎?

此外,如果 ID 不是數據庫生成的,此檢查是否確保用戶傳遞的 object 與他嘗試更新的 ID 具有相同的 ID?

id值來自 URL 路由:

[HttpPut("{id}")]

並且item.Id值來自發布的 model。人們可能認為同時擁有兩者是多余的,但前者是標准 RESTful API 的一部分,而后者可能只是為了請求正文中 model 的完整性。

這里的目的只是進行防御性編程檢查,以確保兩者相同。 如果有人提交了兩個不同的值,那么在語義上它看起來像是試圖修改記錄的 ID,這當然是不允許的。 這只是對此的健全性檢查。

並且不是由客戶提供

客戶必須提供兩者之一,以便您識別要更新的記錄。 您通常可以忽略item.Id如果需要,只需使用 URL 路由中的id值來標識記錄。 但是,如果你這樣做,那么你還需要做以下兩件事之一:

  1. 添加一行代碼設置item.Id = id; 在嘗試將其附加到數據庫上下文之前,或者
  2. 不要將 model 直接添加到數據庫上下文中,而是通過其id作為單獨的 object 獲取記錄並手動更新您要更新的字段。

畢竟,如果客戶端未提供item.Id ,那么它將默認為0 ,實體框架將無法在沒有Id值的情況下直接附加 object。 上述選項將通過直接在 object 上設置它或通過在重新獲取的 object 上使用現有的值來提供該值。

POST 通常用於創建 object。PUT 通常用於更新。 要更新它,您需要知道它的身份。 long id很可能是 URL 或查詢字符串的一部分。 Item item來自 body。 該檢查確保正文中提供的實體與 URL 指定的實體相匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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