ASP.NET MVC和实体框架:生成的数据验证

时间:2014-06-11 14:34:16

标签: c# asp.net-mvc entity-framework

我知道有可能manually add attributes to entity properties,但实体框架可以为我生成这个吗?例如,它知道最大长度为6(如果您查看实体设计器中的属性)。

现在发生的事情是我收到了一条令人讨厌的通用错误消息,但没有显示该字段的长度。

我想我需要在MVC实体框架中接受培训,我应该在截止日期之间的某个地方进行培训。 : - )

2 个答案:

答案 0 :(得分:1)

您可以通过创建自己的T4模板来实现这一目标。

但是,验证是我单独在您的数据层中所做的事情,尤其是在您的业务层中。毕竟,它不仅是一个重要的字段的最大长度,而且它是否是强制性的,特定范围内的数字,依赖于其他实体的验证,等等。并非每个验证/业务规则都可以自动生成,因为它主要还取决于上下文。根据您的体系结构,您可以例如,如果未满足要求,则不允许创建对象。

进行此类验证的一个很好的框架是FluentValidation。它允许您在不同的类中隔离验证;甚至重复使用它们。

您的数据层可能负责数据验证,例如检查外键或其他约束。

答案 1 :(得分:1)

创建方法:

  • 数据库优先
    • 现有数据库 - >生成数据模型
  • 模特第一:
    • 数据模型 - >生成的数据库
  • 代码优先:
    • 现有数据库 - >生成数据模型
    • 数据模型 - >生成的数据库

如果是“数据库优先”,则应为constraint。检查发生在数据库中。

CREATE TABLE suppliers
(
  supplier_id numeric(4),
  supplier_name varchar2(50),
  CONSTRAINT check_supplier_id
  CHECK (supplier_id BETWEEN 100 and 9999)
);

示例:source

如果是模型,首先使用注释或验证类。示例Fluent valitation

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

示例:source

如果代码优先,您可以添加属性约束:

  protected override void OnModelCreating(DbModelBuilder modelBuilder) 
  { 
      modelBuilder.Entity<Blog>().Property(p => p.BloggerName).HasMaxLength(10); 
  } 

示例:source