如何使属性在数据库模型中是必需的,但在 EntityFramework 6 中对于 HTTP post 请求是可选的?

How to make attribute required in database models but optional for a HTTP post request in EntityFramework 6?

我正在构建 Web API 使用 ASP.NET 和 EntityFramework 核心与数据库迁移。在我的 Rental.cs class 中,我有一个 Price 属性,它在数据库中不可为空(因此使用 [Required])。在我从客户端到服务器的 HTTP Post 请求中,我想发送一个 Rental-object 但没有 Price-attribute(因为这应该在服务器上计算出来)。这不起作用,因为价格是 [Required]。

我希望在 database/model 中需要 Price,但在从前端到后端的请求中不需要。我该如何解决这个问题?我应该把它分成两个 class 吗(一个用于数据库,一个用于 post 请求)?

Rental.cs

public class Rental
{
    public int RentalId { get; set; }
    
    [Required]
    public double Price { get; set; }
    
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime OrderTime { get; set; }
    
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Expires { get; set; } 
...

RentalController.cs

[HttpPost]
    public async Task<ActionResult<Rental>> PostNewRental([FromBody] Rental rental)
    {
        // Want to change the Price attribute here by fetching from somewhere else.
        var res = await _rentalService.AddNewRental(rental);
        return Ok(res);
    }

理想情况下,您应该为 DTO(在控制器操作中使用的类型)和您的案例中的模型或实体(您用于 EF 的类型)设置不同的类型。

比如你的DTO应该是

public class RentalDto
{
    public int RentalId { get; set; }
    
    public DateTime OrderTime { get; set; }
    
    public DateTime Expires { get; set; } 
}

你的实体模型应该是

public class Rental
{
    public int RentalId { get; set; }
    
    [Required]
    public double Price { get; set; }
    
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime OrderTime { get; set; }
    
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Expires { get; set; } 
}

然后您可以使用像 AutoMapper 这样的库将 dto 值复制到实体中。

有关详细信息,请阅读 DTO 与模型

This might also help