【问题标题】:Entity Framework 4.1: Override IEnumerable<ValidationResult> Validate实体框架 4.1:覆盖 IEnumerable<ValidationResult> 验证
【发布时间】:2011-08-14 14:37:52
【问题描述】:
    public abstract class Animal , IValidatableObject
    {
        public string Id {get;set;}
        public string Name {get;set;}
        public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (this.Name == "animal")
            {
                yield return new ValidationResult("Invalid Name From base", new[] { "Name" });
            }
        }
    }




    public class Dog: Animal, IValidatableObject
    {
        public string Owner {get;set;}

  public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        /*
          Here call base validate
         */

        if (this.Name == "dog")
        {
            yield return new ValidationResult("Invalid Name From dog", new[] { "Name" });
        }
    }     

    }

我有一个基类Animal,它实现了IValidatableObject,现在来自Dog子类的Validate方法,它也实现了IValidatableObject,我想调用基类的Validate方法。

我试过了(它不调用基类的验证)

base.Validate(validationContext);

【问题讨论】:

    标签: c# entity-framework entity-framework-4 entity-framework-4.1


    【解决方案1】:

    在您的代码示例中,您没有从 Animal 派生您的狗类。 只有在您迭代时才会调用动物的验证方法 通过结果集:

    public class Dog : Animal
    {
      public override IEnumerable<ValidationResult> Validate(ValidationContext      validationContext)
      {
         foreach(var result in base.Validate(validationContext))
         {
         }
    
         //dog specific validation follows here...
      }
    }
    

    只有调用 base.Validate() 而不遍历返回的集合才会 不调用 base 的验证方法。 希望,这会有所帮助。

    【讨论】:

    • 实际上我的代码包含这部分“公共类狗:动物”(从动物继承)。只是提问时打错字,已更正。
    • 您是否尝试调用 base.Validate() 并遍历返回的结果集?这应该可以解决您的问题。动物的 Validate 方法被调用!
    【解决方案2】:
    public class Dog : Animal
    {
      public override IEnumerable<ValidationResult> Validate(ValidationContext      validationContext)
      {
         foreach(var result in base.Validate(validationContext).ToList())
         {
         }
    
         //dog specific validation follows here...
      }
    }
    

    你需要调用ToList(),因为基本方法返回IEnumerable类型数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2011-08-12
      相关资源
      最近更新 更多