为最小 int 值设置约束
Set a constraint for minimum int value
我正在使用存储库模式。我有一个名为 Product 的实体,我想设置价格的最小值以避免零价格。是否可以在 EntitytypeConfiguration class 中创建它?
我的产品配置class
public class ProductConfiguration : EntityTypeConfiguration<Product>
{
public PlanProductConfiguration(string schema = "dbo")
{
ToTable(schema + ".Product");
HasKey(x => new { x.IdProduct });
Property(x => x.Price).HasColumnName("flt_price")
.IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
我想你想要的是 属性 的默认值。不幸的是,目前 EF 不支持 setting default values。但是,作为您的问题的解决方案,您可以在 Product
class 中创建一个构造函数,并将 Price
属性 设置为您想要的最小值:
public class Product
{
//...
public Product
{
Price=1; //set your minimum price here
}
}
如果您需要该约束,则不能通过 EF 配置应用它,但可以使用 check
应用它,请参阅 here on the database directly, or you can apply data annotations on the model see this SO post
类似于:
[Range(0M, Double.MaxValue)]
public double Price { get; set; }
但是,如果您使用的是视图模型,那不会有什么不同,因为这些验证仅应用于 ASP.NET 对象创建(通常是在从 Web 请求创建实例到控制器时),所以当 you 创建一个实例时,你不必遵守属性,所以如果你想坚定地验证它,你需要应用自定义 getter 和 setter 而不是自动属性,例如:
public class Product
{
private double _price;
[Range(0M, Double.MaxValue)]
public double Price {
get {
return _price;
}
set {
if (value <= 0M) {
throw new ArgumentOutOfRangeException("value",
"The value must be greater than 0.0");
}
_price = value;
}
}
}
只要数据库中没有无效数据,这在 EF 中就可以正常工作。
对于服务器端验证,在您的实体上实施 IValidatableObject。对于客户端验证,如果您使用的是 MVC,请将数据注释添加到您的视图模型。要添加数据库约束,请通过在迁移中调用 Sql() 方法来添加检查约束。
我建议使用 Fluent Validation 而不是基于属性的验证:
- 使用富有表现力的 lambda 表达式
- 可以保留在模型之外的其他组件中
- 不会用不相关的代码污染 POCO
我正在使用存储库模式。我有一个名为 Product 的实体,我想设置价格的最小值以避免零价格。是否可以在 EntitytypeConfiguration class 中创建它?
我的产品配置class
public class ProductConfiguration : EntityTypeConfiguration<Product>
{
public PlanProductConfiguration(string schema = "dbo")
{
ToTable(schema + ".Product");
HasKey(x => new { x.IdProduct });
Property(x => x.Price).HasColumnName("flt_price")
.IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
我想你想要的是 属性 的默认值。不幸的是,目前 EF 不支持 setting default values。但是,作为您的问题的解决方案,您可以在 Product
class 中创建一个构造函数,并将 Price
属性 设置为您想要的最小值:
public class Product
{
//...
public Product
{
Price=1; //set your minimum price here
}
}
如果您需要该约束,则不能通过 EF 配置应用它,但可以使用 check
应用它,请参阅 here on the database directly, or you can apply data annotations on the model see this SO post
类似于:
[Range(0M, Double.MaxValue)]
public double Price { get; set; }
但是,如果您使用的是视图模型,那不会有什么不同,因为这些验证仅应用于 ASP.NET 对象创建(通常是在从 Web 请求创建实例到控制器时),所以当 you 创建一个实例时,你不必遵守属性,所以如果你想坚定地验证它,你需要应用自定义 getter 和 setter 而不是自动属性,例如:
public class Product
{
private double _price;
[Range(0M, Double.MaxValue)]
public double Price {
get {
return _price;
}
set {
if (value <= 0M) {
throw new ArgumentOutOfRangeException("value",
"The value must be greater than 0.0");
}
_price = value;
}
}
}
只要数据库中没有无效数据,这在 EF 中就可以正常工作。
对于服务器端验证,在您的实体上实施 IValidatableObject。对于客户端验证,如果您使用的是 MVC,请将数据注释添加到您的视图模型。要添加数据库约束,请通过在迁移中调用 Sql() 方法来添加检查约束。
我建议使用 Fluent Validation 而不是基于属性的验证:
- 使用富有表现力的 lambda 表达式
- 可以保留在模型之外的其他组件中
- 不会用不相关的代码污染 POCO