如何使属性在数据库模型中是必需的,但在 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 与模型
我正在构建 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 与模型