2011-03-13 41 views
12

Tengo un modelo de clases que tiene una propiedad de descripción con un atributo de anotación de datos de StringLength y la longitud se establece en 100 caracteres. Cuando esta propiedad tiene más de 100 caracteres y Entity Framework intenta guardar esta propiedad, aparece el siguiente error.C# Cómo utilizar DataAnnotations StringLength y SubString para eliminar texto

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
     public string Description { get; set; } 

error:
"Error en la validación de una o más entidades Ver propiedad '' EntityValidationErrors para más detalles."

No estoy seguro de si esto ayuda en la formación de una solución, pero Estoy usando Entity Framework CTP5 y Code First.

Lo que quiero hacer es si la descripción tiene más de 100 caracteres, luego elimino los caracteres que tienen más de 100 caracteres para que la descripción se pueda almacenar y no se produzca ningún error.

Creo que debería poder utilizar el atributo DataAnnotación StringLength manualmente para ayudarme a identificar la longitud válida de la descripción y luego usar SubString para eliminar cualquier carácter que exceda el valor válido.

¿Alguien sabe cómo utilizar DataAnnotation en esta situación? ¿O hay otras opciones disponibles?


actualización hice lo que sugirió BrokenGlass y aquí mi aplicación si:

public static class DataAnnotation 
{ 
    public static int? GetMaxLengthFromStringLengthAttribute(Type modelClass, string propertyName) 
    { 
     int? maxLength = null; 
     var attribute = modelClass.GetProperties() 
         .Where(p => p.Name == propertyName) 
         .Single() 
         .GetCustomAttributes(typeof(StringLengthAttribute), true) 
         .Single() as StringLengthAttribute; 

     if (attribute != null) 
      maxLength = attribute.MaximumLength; 

     return maxLength; 
    } 
} 


int? maxLength = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(Car), "Description"); 

if(maxLength != null && car.Description.Length > maxLength) 
    car.Description = car.Description.Substring(0, maxLength.Value); 

BarDev

+0

¿Hay alguna otra etiqueta que deba agregar para esta pregunta? –

+0

No sé mucho sobre DataAnnotation. En cuanto a otras opciones, podría implementar los getters/setters, y hacer un check/truncation en el setter. – Rob

+0

Gracias por la sugerencia. Simplemente lo hice como un trabajo completo. Probablemente estoy complicando el problema. Pero, puedo ver diferentes situaciones en las que me gustaría tener Validación y otras situaciones en las que me gustaría eliminar caracteres adicionales. En mi aplicación WCF, me gustaría eliminar el carácter adicional y no generar un error, pero en una aplicación de entrada de datos como ASP.NET o Win Forms me gustaría activar un mensaje de validación para el usuario. –

Respuesta

9

Siempre se puede comprobar el valor del atributo utilizando la reflexión, a pesar de que el enfoque no es el lo mejor si puede evitarlo: no es bonito:

var attribute = typeof(ModelClass).GetProperties() 
            .Where(p => p.Name == "Description") 
            .Single() 
            .GetCustomAttributes(typeof(StringLengthAttribute), true) 
            .Single() as StringLengthAttribute; 

Console.WriteLine("Maximum Length: {0}", attribute.MaximumLength);  
+0

Podría usar esto. Podría encapsular esto y llamarlo desde cualquier parte de mi código. Voy a esperar un poco más y ver si obtengo respuestas adicionales. Gracias por la respuesta. –

2

Crear un modelo de vista que no tiene una anotación de datos para la longitud, a continuación, puede asignar al modelo de entidad y truncar el valor si se trata de más de 100.

+0

Debería haber mencionado que necesito la anotación de datos para la validación en mi aplicación MVC3, para que no tenga que repetir el código. –

+0

Todo depende de dónde desee imponer restricciones.Tiendo a mantener mi modelo de "datos" limpio y forzo a ViewModel a validar para que mi ViewModel tenga las anotaciones. –

10

Por qué todos los problemas? ¿Por qué no?

private string _description = string.Empty; 

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
public string Description 
{ 
    get { return _description; } 
    set { _description = value.Substring(0,100); }; // or something equivalent 
} 
+8

Su 'set' está derrotando completamente la validación, solo truncando silenciosamente. Eso es absurdo. Ya sea validar o truncar. Pero truncar silenciosamente es una idea horrible y horrible. – ErikE

Cuestiones relacionadas