【问题标题】:ASP.NET MVC and Entity Framework: Generated Data ValidationASP.NET MVC 和实体框架:生成的数据验证
【发布时间】:2014-06-11 14:34:16
【问题描述】:

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

现在发生的情况是,我收到一条令人讨厌的通用错误消息,但没有指明字段的长度。

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 感谢您的详细回复!我认为我的误解是实体框架验证不会作为ModelState.IsValid 的一部分发生,就像自定义数据注释的情况一样。我必须捕获异常,或者使用db.GetValidationErrors(),并为每个验证错误手动调用ModelState.AddModelError。我想知道是否有办法为我生成的所有视图跳过这个看似不必要的步骤。
    • PS:答案中最具启发性的部分是实体框架验证的第三个示例源。 (我先用数据库。)
    【解决方案2】:

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

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

    进行这种验证的一个很好的框架是FluentValidation。它允许您将验证隔离在单独的类中;甚至重复使用它们。

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

    【讨论】:

    • 如果限制是基于持久层的限制,那么它绝对应该在数据访问层(应该在数据层之上)。
    • 我会谷歌 T4 模板,看看它是否能帮助我。我想要的是显示实体框架验证(作为 ModelState.IsValid 的一部分),而不必手动处理我生成的所有控制器中的异常。
    猜你喜欢
    • 2011-02-13
    • 2010-11-11
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2010-09-25
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多