7

我正在使用存储库模式。我有一个名为 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);
   }
}
4

4 回答 4

7

如果您想要该约束,则不能通过 EF 配置应用它,但您可以直接在数据库上使用checksee here应用它,或者您可以在模型上应用数据注释,请参阅此SO 帖子

就像是:

[Range(0M, Double.MaxValue)]
public double Price { get; set; }

但是,如果您使用视图模型,这不会有什么不同,因为这些验证仅适用于 ASP.NET 对象创建(通常在从 Web 请求创建实例到控制器时),所以当创建实例时不必遵守属性,所以如果你想坚定地验证它,你需要应用自定义 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 中正常工作。

于 2015-02-21T20:09:44.080 回答
3

Rather than attributes-based validation I recommend to use Fluent Validation which:

  • uses expressive lambda expressions
  • can be kept in other assembly than the models
  • doesn't polute POCOs with unrelated code
于 2015-02-22T22:31:42.600 回答
2

对于服务器端验证,请在您的实体上实现 IValidatableObject。对于客户端验证,如果您使用的是 MVC,请将数据注释添加到您的视图模型中。要添加数据库约束,请通过在迁移中调用 Sql() 方法添加检查约束。

于 2015-02-22T09:47:23.340 回答
0

我认为您想要的是您的财产的默认值。不幸的是,EF 目前不支持设置默认值。但是,作为您的问题的解决方案,您可以在您的Product类中创建一个构造函数,Price并使用您想要的最小值设置属性:

public class Product
{
   //...
   public Product
   {
      Price=1; //set your minimum price here
   }
}
于 2015-02-21T20:09:14.997 回答