C# 用“处理”处理财产;“数据库生成”;在ASP.NET核心WebAPI中,使用实体框架核心

C# 用“处理”处理财产;“数据库生成”;在ASP.NET核心WebAPI中,使用实体框架核心,c#,asp.net-core,asp.net-web-api,entity-framework-core,C#,Asp.net Core,Asp.net Web Api,Entity Framework Core,我有以下模型类: 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操作时,我

我有以下模型类:

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
属性的对象,这样用户就可以知道要查询哪个Id进行更新或特定的GET。但是,我不希望客户端在执行POST请求时能够为ID属性提供一个值,并且希望它作为
IDENTITY
的一部分由数据库生成


如何实现这一点?

您不能手动设置标识(自动递增)列的值

在下面的示例中,PurchaseId是一个标识列

purchase.PurchaseId = 6;
_dbContext.Purchases.Add(purchase);
_dbContext.SaveChanges();
当保存对数据库的更改时,EF Core抛出Microsoft.EntityFrameworkCore.DbUpdateException
with
当identity\u insert设置为OFF时,无法为表“Purchases”中的identity列插入显式值。
错误

因此,默认情况下,无法指定该值

但这不是问题所在

更大的问题是,您正在向客户机公开域类。API设计中的此缺陷可能会导致更多问题。

您必须创建一个DTO,例如CreateItemDTO,其唯一职责是包含在数据库中创建项所需的所有方法

同样,您不应该在GET请求中公开Item类。当暴露不用于客户端的API相关列时,这会导致一个问题。创建一个GetItemDTO,它只包含对GET请求重要的信息

CreateItemDTO

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

阅读了解更多信息。

您的代码有什么问题?它完全按照您的要求执行,如果客户端在插入时填写其Id,它将抛出异常,您可以将错误的请求返回给client@ArmanEbrahimpour是吗?!让我检查一下……因为您将Id配置为自动生成,所以当您尝试使用自定义IDB插入记录时,您的数据库将引发异常,但DTO不应该也包含Id属性,以便客户端可以知道他们要更新的对象的Id是什么?@Shrodinger这就是为什么此DTO被称为CreateItemDTO的原因。UpdateItemDTO将包含{ID,Name}。我知道在基本级别上,每个端点的DTO可能看起来有些过分。但是,当每个端点的需求发生变化时,它将始终帮助您。这是在客户开始成熟之后发生的。