实体框架复杂类型自定义验证,停止验证递归

Ale*_*len 5 entity-framework customvalidator entity-framework-ctp5 entity-framework-4.1

我们使用复杂类型来管理我们的可翻译字段,如下所示:

[ComplexType]
public class Translated
{
    [Required]
    public string NL { get; set; }

    [Required]
    public string EN { get; set; }

    [ScaffoldColumn(false)]
    public string TranslatedText
    {
        get
        {
           return Util.Translate(NL, EN); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们要求字段存在.但在某些情况下,整个Translated字段是可选的,如:

public class Question
{
    ...

    [Optional(ErrorMessage="Foo")]
    public Translated Description { get; set; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎可以计算Optional属性,当它返回false时,结果不会执行任何操作.

class OptionalAttribute : ValidationAttribute 
{
    public override bool IsValid(object value)
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我将可选属性放在非复杂类型上时,它按预期工作,错误消息将始终为Foo.

最终目标是在两种情况下允许描述为空,但是当填充其中一个字段时,错误当然应该传播.

停止验证递归会导致该字段是可选的,但是如果字段填充,它也会阻止字段的验证.

有关如何实现这一目标的任何想法?

cka*_*kal 7

[Required]在字符串属性上使用数据注释将在数据库中创建不可为空的字段.从您的描述看来,有时您会希望这两个值都为空.

我建议实现自己的验证,定义使这些字段可选的原因.

[ComplexType]
public class Translated : IValidatableObject
{
    public string NL { get; set; }

    public string EN { get; set; }

    [NotMapped]
    public string TranslatedText
    {
        get
        {
            return Util.Translate(NL, EN);
        }
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!string.IsNullOrEmpty(NL) && string.IsNullOrEmpty(EN))
            yield return new ValidationResult("EN is required if NL is entered.");

        if (!string.IsNullOrEmpty(EN) && string.IsNullOrEmpty(NL))
            yield return new ValidationResult("NL is required if EN is entered.");
    }
}
Run Code Online (Sandbox Code Playgroud)