我可以忽略 ASP.Net 核心 API 模型中的 属性 吗?

Can I ignore a property in an ASP.Net Core API model?

我的 API 上有一个模型如下:

namespace Models
{
    public class Car
    {
        public guid Id { get; set; }

        public string Name { get; set; }
    }
}

此模型用于我的 API 中的 POST 端点,允许用户将汽车添加到系统。

我遇到的问题是 Id 是由数据库决定的。发布此有效负载时,我希望用户不指定 ID。

当我开始我的项目并查看自动生成的 swagger 文档时,Id 字段在那里并自动填充。

如何抑制这个 Id 字段,以便用户只会在 JSON 有效负载中发送汽车 Name 字段?

当用户执行 GET /car/12345 时,我希望 JSON 负载中返回 Id 字段,所以我不想完全忽略它。

如果您使用的是 Swashbuckle,您可以安装 Swashbuckle.AspNetCore.Annotations NuGet 包,然后使用 SwaggerSchema 属性,如下所示:

namespace Models
{
    public class Car
    {
        [SwaggerSchema(ReadOnly = true)]
        public guid Id { get; set; }

        public string Name { get; set; }
    }
}

这将在生成的 OpenAPI 文档中用 ReadOnly 属性标记 属性。

如果你想在接受输入时完全排除属性,你可以创建一个单独的输入模型。输入模型的价值在于它反映了该操作所需的特定数据子集,不一定反映数据库或以后检索所需的内容,并允许您分离输入验证等行为,以便您不要将该责任推给您的主要 DTO。现在,收到的输入可能以某种方式注入 ID 或以您不希望的方式错误处理 属性 的风险为零。

public class CarInputModel 
{
   [Required]
   public string Name { get; set; }

   public Car ToCar() => new() { Id = Guid.Empty, Name = Name };
}

public class Car 
{
   public Guid Id { get; set; }

   public string Name { get; set; }
}

一旦您的 API 收到该输入模型,您就可以将该输入模型转换为 Car,因为您知道您可以完全控制用户提供的输入。