2012-03-06 19 views
9

Estoy haciendo un desarrollo de primer código con Entity Framework 4.3 y no parece que sea posible expresar un CHECK constraint a través de anotaciones de atributos o, bueno, cualquier otro medio. Veo que EF 5.0 agregará soporte para checking enumerations, pero eso no es exactamente lo que busco aquí.¿Es posible expresar una restricción de verificación?

Para dar un ejemplo simplificado, me gustaría validar que todos los objetos Person tienen un nombre de "Bob" o "Harry" y tienen 5, 10 o 30 años.

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

puedo ejecutar un script alter para agregar estas restricciones después de los hechos y puedo rodar mi propio atributo de verificación para realizar validaciones, pero hay una manera de que me falta para expresar restricciones CHECK en realidad no enumerados en ¿Marco de la entidad?

Respuesta

3

Se puede escribir uno usted mismo (no probado):

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; 
    } 
} 
+0

he escrito mi propio atributo de verificación (que se ve extrañamente similar a la suya), pero mi El problema es que este es un atributo de solo dominio: no se refleja en la entidad de la tabla de respaldo con una restricción de verificación también de la misma manera que, por ejemplo, MaxLength de una cadena se refleja en la estructura de la tabla. – 48klocs

+1

No soy muy versado en EF pero abrí 'EntityFramework.dll' en ILSpy y parece que' System.Data.Entity.Internal.Validation.EntityValidatorBuilder' es responsable de analizar los atributos y decidir qué hacer con ellos. Parece que 'RequiredAttribute',' MaxLengthAttribute', 'StringLengthAttribute', y' DisplayAttribute' están básicamente integrados en el proceso de creación de la base de datos. No estoy seguro de que sea posible hacer lo que está buscando con EF como lo es hoy. –

4

He querido poner restricciones de comprobación, y si bien hay un par de maneras de hacerlo como la respuesta dada aquí por M. Babcock y el uso de ExecuteSql en el inicializador para agregar restricciones a la base de datos manualmente.

pero creo que el método más sencillo es utilizar una anotación RegularExpression, por lo que en su ejemplo que iría:

<!-- language: c# --> 
public class Person 
{ 
    [Required] 
    [RegularExpression(@"Bob|Harry")] 
    public string FirstName { get; set; } 

    [Required, RegularExpression(@"5|30|50")] 
    public int Age { get; set; } 
} 
+0

Esto solo funciona si la restricción de verificación puede validarse con una expresión regular. Esto funciona para // los ejemplos simplificados // del OP. En otro caso, será útil una validación personalizada, como la describe @ M.Babcock. –

Cuestiones relacionadas