【问题标题】:Set a constraint for minimum int value为最小 int 值设置约束
【发布时间】:2015-04-23 09:43:07
【问题描述】:

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

【问题讨论】:

  • 不幸的是 Fluent API 仅支持 MaxLength

标签: c# entity-framework ef-code-first ef-fluent-api


【解决方案1】:

如果你想要那个约束,你不能通过 EF 配置应用它,但你可以使用check 直接在数据库上应用它,参见here,或者你可以在模型上应用数据注释,参见这个@ 987654322@

类似:

[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:引用 System.Data.DataAnnotations.dll 有什么问题?
  • 嗨@abatishchev,在我的领域层中,包含实体,我不认为这是一个最佳实践参考除了系统。我想我会按照科林的方式来告诉结果。谢谢!
  • 从保守的角度来看,您只能引用 BCL DLL。所以你没事。但实际上,您可以参考实现目标所需的任何内容。它不会违反任何原则或做法。
【解决方案2】:

我建议使用Fluent Validation 而不是基于属性的验证:

  • 使用富有表现力的 lambda 表达式
  • 可以保存在模型以外的其他组件中
  • 不会用不相关的代码污染 POCO

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      public class Product
      {
         //...
         public Product
         {
            Price=1; //set your minimum price here
         }
      }
      

      【讨论】:

      • 这个问题与默认值无关,这绝不会阻止输入零。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多