簡體   English   中英

使用 Entity Framework Core 在 ASP.NET Core WebAPI 中使用“DatabaseGenerated”處理屬性

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

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