实体框架4.1:覆盖IEnumerable< ValidationResult>验证 [英] Entity Framework 4.1: Override IEnumerable<ValidationResult> Validate

查看:108
本文介绍了实体框架4.1:覆盖IEnumerable< ValidationResult>验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

公共抽象类Animal,IValidatableObject
{
public string Id {get; set;}
public string Name {get; set;}
public virtual IEnumerable< ValidationResult>验证(ValidationContext validationContext)
{
if(this.Name ==animal)
{
yield返回新的ValidationResult(Invalid Name from base,new [] { 名称 });
}
}
}




public class Dog:Animal,IValidatableObject
{
public string所有者{get; set;}

public override IEnumerable< ValidationResult>验证(ValidationContext validationContext)
{
/ *
这里调用base validate
* /

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

}

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



我尝试了(它不会调用基类验证)

  base.Validate(validationContext); 


解决方案

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

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

//狗具体验证如下这里...
}
}

只调用base.Validate()没有迭代返回的集合将
不调用基础的验证方法。
希望,这有帮助。


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

    }

I have a base class Animal which implements IValidatableObject, now from Dog sub-class's Validate method which also implements IValidatableObject, I want to call base class's Validate method.

I tried doing (it doesn't call base class's validate)

base.Validate(validationContext);

解决方案

In your code sample you did not derive your dog class from Animal. The animal's validation method will only be called if you iterate through the result set:

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

     //dog specific validation follows here...
  }
}

Only calling base.Validate() without iterating through the returned collection will not call the base's validation method. Hope, this helps.

这篇关于实体框架4.1:覆盖IEnumerable&lt; ValidationResult&gt;验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆