Можно ли выразить проверочное ограничение? - PullRequest
9 голосов
/ 06 марта 2012

Я занимаюсь разработкой кода с помощью Entity Framework 4.3, и кажется, что невозможно выразить ограничение CHECK с помощью аннотаций атрибутов или, ну, другими способами.Я вижу, что EF 5.0 будет добавлять поддержку для проверки перечислений , но это не совсем то, что мне нужно здесь.

Чтобы привести упрощенный пример, я хотел бы проверить, что всеPerson объекты имеют имя «Боб» или «Гарри» и им 5, 10 или 30 лет.

public class Person
{
    [Required]
    [Check("Bob", "Harry")]  //yes, this attribute is imaginary
    public string FirstName { get; set; }

    [Required, Check(5, 30, 50)]  //check is still imaginary
    public int Age { get; set; }
}

Я могу запустить скрипт изменения, чтобы добавить эти ограничения после фактаи я могу свернуть свой собственный атрибут проверки для выполнения проверок, но есть ли способ, который мне не хватает, чтобы фактически выразить не перечисленные ограничения CHECK в Entity Framework?

Ответы [ 2 ]

5 голосов
/ 19 марта 2012

Я хотел вставить ограничения Check, и хотя есть несколько способов сделать это, например, ответ, данный здесь M.Babcock, и использование ExecuteSql в Initializer для добавления ограничений в базу данных вручную.

Но я думаю, что самый простой способ - использовать аннотацию RegularExpression, так что в вашем примере вы должны перейти:

public class Person
{
    [Required]
    [RegularExpression(@"Bob|Harry")]  
    public string FirstName { get; set; }

    [Required, RegularExpression(@"5|30|50")]  
    public int Age { get; set; }
}
3 голосов
/ 06 марта 2012

Вы можете написать один самостоятельно (без проверки):

public class CheckAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
{
    object[] ValidValues;

    public CheckAttribute<T>(params T[] validValues)
    {
        ValidValues = validValues;
    }

    public override bool IsValid(object value)
    {
        return ValidValues.FirstOrDefault(v => v.Equals(value)) != null;
    }
}
...