实体框架4.1:覆盖IEnumerable <ValidationResult>验证

Rus*_*ova 5 c# entity-framework entity-framework-4 entity-framework-4.1

    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" });
        }
    }     

    }
Run Code Online (Sandbox Code Playgroud)

我有一个基类Animal 实现IValidatableObject,现在从Dog子类的Validate方法也实现IValidatableObject,我想调用基类的 Validate方法.

我试过(它没有调用基类的验证)

base.Validate(validationContext);
Run Code Online (Sandbox Code Playgroud)

Han*_*ans 9

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

public class Dog : Animal
{
  public override IEnumerable<ValidationResult> Validate(ValidationContext      validationContext)
  {
     foreach(var result in base.Validate(validationContext))
     {
     }

     //dog specific validation follows here...
  }
}
Run Code Online (Sandbox Code Playgroud)

只调用base.Validate()而不迭代返回的集合将不会调用base的验证方法.希望这可以帮助.