我正在使用Repository模式。我有一个名为Product的实体,我想设置价格的最小值以避免零价格。是否可以在EntitytypeConfiguration类中创建它?
我的产品配置类
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);
}
}
答案 0 :(得分:4)
如果您需要该约束,则无法通过EF配置应用它,但您可以使用check
直接在数据库中查看here来应用它,或者您可以应用数据注释在模型上看到这个SO post
类似的东西:
[Range(0M, Double.MaxValue)]
public double Price { get; set; }
但是,如果您使用的是视图模型,则不会产生影响,因为这些验证仅适用于ASP.NET对象创建(通常在从Web请求创建实例到控制器时),所以当你创建一个你不必遵守属性的实例,所以如果你想要坚定地验证它,你需要应用自定义的getter和setter而不是自动属性,如:< / p>
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中就可以正常工作。
答案 1 :(得分:1)
对于服务器端验证,在您的实体上实现IValidatableObject。对于客户端验证,如果您使用的是MVC,请将数据注释添加到视图模型中。要添加数据库约束,请通过在迁移中调用Sql()方法来添加检查约束。
答案 2 :(得分:1)
我建议使用Fluent Validation而不是基于属性的验证:
答案 3 :(得分:0)
我认为您想要的是您的财产的默认值。在这一刻,不公平的EF并不支持setting default values。但是,作为问题的解决方案,您可以在Product
类中创建一个构造函数,并将Price
属性设置为您想要的最小值:
public class Product
{
//...
public Product
{
Price=1; //set your minimum price here
}
}