
DbEntityValidationException es el tipo de excepción lanzada por Entity Framework cuando falla la validación de las entidades. Esta excepción es extremadamente valiosa, pero por defecto el mensaje de la excepción omite lo más importante: los errores producidos por la validación.
Aquellos que habéis usado Entity Framework probablemente estaréis familiarizados con el siguiente mensaje:
System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See ‘EntityValidationErrors’ property for more details.
Este mensaje es muy claro en cuanto al problema que se esta produciendo: Algo no es valido y si quieres saber el qué, entonces debes inspeccionar la excepción con un depurador.
El porque se obvia la información es claro. Si tenemos la aplicación en un entorno de producción, no es conveniente devolver errores que puedan dar información sensible sobre la estructura de datos.
El problema es que, sobretodo cuando estamos en periodo de desarrollo, si nos interesa que en el cuerpo del mensaje aparezcan campos provocaron el error, sin necesidad de adjuntar un depurador, y que de esta forma nos facilite depurar las acciones.
Extendiendo mensaje de error de DbEntityValidationException
DbEntityValidationException es lanzado por el método SaveChanges que reside en la clase DbContext.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
try { DataContext.SaveChanges(); } catch (DbEntityValidationException ex) { // Retrieve the error messages as a list of strings. var errorMessages = ex.EntityValidationErrors .SelectMany(x => x.ValidationErrors) .Select(x => x.ErrorMessage); // Join the list to a single string. var fullErrorMessage = string.Join("; ", errorMessages); // Combine the original exception message with the new one. var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); // Throw a new DbEntityValidationException with the improved exception message. throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); } } |
¡Y ya está! El ejemplo de código anterior lo uso en mi clase UnitOfWork, que es la que instancio en mis proyectos para hacer los commits. En todo caso, si no usáis este sistema, podéis hacer este try/catch en cualquier sitio donde uséis SaveChanges de Entity Framework.
A partir de ahora, las excepciones se verán así:
System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See ‘EntityValidationErrors’ property for more details. The validation errors are: The field PhoneNumber must be a string or array type with a maximum length of ’12’; The LastName field is required.
Es decir, extendiendo el mensaje de DbEntityValidationException se pueden ver las entidades que provocaron los errores de validación. Mucho más útil en el desarrollo de nuestras aplicaciones.
Destacar que los errores de validación pueden contener información sensible e incluirlos en el mensaje de excepción que se devuelve al usuario puede ser peligroso. Es la razón por la que Microsoft optó por ponerlos en otro lugar (propiedades), y accesible desde una herramienta de debug. Por tanto, esta solución es práctica, pero debe tomarse con precaución.
Javi Giner
Latest posts by Javi Giner (see all)
- IIS Express Visual Studio, como configurar para permitir conexiones remotas - febrero 26, 2016
- Evento solidario sobre Innovación - diciembre 14, 2015
- Uso de Component en Unity - noviembre 10, 2015
Me sirvió mucho. Gracias
Hola Jeremy, muchas gracias a tí por llegar hasta aquí. Espero poder seguir subiendo cosas que os ayuden. Un abrazo
Muchas gracias! me fue de gran ayuda ya que no sabia cual habia sido el error 🙂