设置最小整数值的约束条件

8
我是使用仓储模式,我有一个名为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);
   }
}

1
不幸的是,Fluent API 仅支持 MaxLength - abatishchev
3个回答

7
如果您想要这样的约束条件,您不能通过EF配置应用它,但是您可以直接在数据库上使用check(请参见此处),或者您可以在模型上应用数据注释(请参见此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中可以正常工作,只要数据库中没有无效数据。

谢谢您的回答。数据注释的问题是因为我无法在包含实体的域项目中添加其他引用。我会将注释放在视图模型中,并直接在数据库中添加约束。谢谢! - Rodrigão
@Rodrigão:引用 System.Data.DataAnnotations.dll 有什么问题吗? - abatishchev
嗨@abatishchev,在我的领域层中,包含实体,我认为最好的做法是只引用System而不是其他任何东西。我想我会按照Colin的方式来处理并告诉结果。谢谢! - Rodrigão
从保守的角度来看,你只能引用BCL DLLs。所以你没问题。但实际上,你可以引用任何你需要实现目标的东西。这不会违反任何原则或实践。 - abatishchev

3
与其使用基于属性的验证方式,我建议使用Fluent Validation,它具有以下优点:
  • 使用表达式更加清晰明了。
  • 可以存放在不同于模型的程序集中。
  • 不会污染POCOs与其他代码无关的代码。

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接