[英]What is the purpose of this check in this PUT method of ASP.NET Core WebAPI with Entity Framework Core?
[英]Handling properties with "DatabaseGenerated" in ASP.NET Core WebAPI with Entity Framework Core
我有以下 model class:
public class Item
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required(ErrorMessage = "You must provide a name.")]
[MaxLength(255)]
public string Name { get; set; }
}
在執行 GET 操作時,我想返回帶有Id
屬性的 object,這樣用戶就可以知道查詢更新或特定 GET 的 ID。 但是,我不希望客戶端在執行 POST 請求時能夠為 ID 屬性提供值,並希望它由數據庫生成作為IDENTITY
事物的一部分。
我將如何實現這一目標?
您不能手動設置標識(自動遞增)列的值。
在這里,在下面的示例中,PurchaseId 是一個標識列。
purchase.PurchaseId = 6;
_dbContext.Purchases.Add(purchase);
_dbContext.SaveChanges();
將更改保存到數據庫時,EF Core 拋出Microsoft.EntityFrameworkCore.DbUpdateException
, Cannot insert explicit value for identity column in table 'Purchases' when IDENTITY_INSERT is set to OFF.
錯誤。
因此,默認情況下,您無法分配該值。
但這不是這里的問題。
更大的問題是您將域類公開給您的客戶。 API 設計中的這個缺陷可能導致的問題不止於此。
您必須創建一個 DTO,例如 CreateItemDTO,它的唯一職責是包含在數據庫中創建項目所需的所有方法。
同樣,您不應在 GET 請求中公開項目 class。 當 API 不針對客戶端的相關列被暴露時,這會導致問題。 創建一個 GetItemDTO,它只包含對 GET 請求很重要的信息。
創建項目DTO
public class CreateItemDTO
{
[Required(ErrorMessage = "You must provide a name.")]
[MaxLength(255)]
public string Name { get; set; }
}
閱讀API 上的公開域模型以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.