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