验证实体框架中的POCO对象

时间:2012-04-11 10:05:56

标签: c# entity-framework

我正在使用Entity Framework制作应用程序。我有以下代码:

public class Entity : IValidatableObject
{
    public int EntityId { get; set; }

    [MaxLength(10)]
    public string Name { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext = null)
    {
        if (Name == "John")
            yield return new ValidationResult("Not allowed.", new[] { "Name" });
    }

    public bool IsValid(ValidationContext validationContext = null)
    {
        return !Validate(validationContext).GetEnumerator().MoveNext();
    }
}

实体框架类在进行自己的验证时会使用此验证器:

using (var dt = new DatabaseContext()) {
    Entity en = new Entity();
    en.Name = "John";
    dt.Entities.Add(en);
    String err = dt.GetValidationErrors().First().ValidationErrors.First().ErrorMessage;
    // err == "Not Allowed."
}

但是,他们也使用'MaxLength'属性:

using (var dt = new DatabaseContext()) {
    Entity en = new Entity();
    en.Name = "01234567890";
    dt.Entities.Add(en);
    String err = dt.GetValidationErrors().First().ValidationErrors.First().ErrorMessage;
    // err == "The field Name must be a string or array type with a maximum length of '10'."
}

我写的IsValid方法不知道MaxLength属性:

using (var dt = new DatabaseContext()) {
    Entity en = new Entity();
    en.Name = "John";
    en.IsValid; // false
    en.Name = "01234567890";
    en.IsValid = // true;
}

如何让我的IsValid方法了解实体框架验证器使用的数据注释属性?

1 个答案:

答案 0 :(得分:1)

您可以尝试实施已接受的答案here中显示的示例。它基本上只是手动强制调用数据注释检查,但我找不到更好的方法。