vitutor tipos resueltos relativo posible porcentual medicion maximo errores error ejercicios como calculo calcular absoluto .net entity-framework entity-framework-4.1 ef-code-first

.net - tipos - maximo error posible



Obtener el tipo de error exacto desde DbValidationException (5)

Bueno, tuve el mismo problema. Mi modelo funcionó bien en EF CTP5 pero no pudo construir en 4.1 con el mismo error "" Falló la validación para una o más entidades "cuando intenté inicializarlo. Me di cuenta de que tenía una propiedad:

public string Comment {get; set;}

Luego, en el método de semilla en el inicializador sobrescrito, tuve un comentario bastante largo (alrededor de 600 letras).

Creo que el punto es: en EF 4.1 tienes que establecer anotaciones de datos explícitamente en algunos casos. Para mí, configuración:

[StringLength(4000)] public string Comment {get; set;}

ayudado. Es extraño ya que CTP5 no tuvo problemas con eso.

Tengo la situación en la que estoy inicializando mi modelo en DatabaseInitializer () para EF 4.1 y obtengo este molesto error "Validation failed for one or more entities. See ''EntityValidationErrors'' property for more details." Por lo tanto, voy a este EntityValidationErrors y hay un campo {System.Data.Entity.Validation.DbEntityValidationResult} que no me proporciona información sobre qué campo no fue capaz de inicializar. ¿Hay alguna forma de obtener más información sobre este error?

Para aclarar las cosas:

Sé cómo solucionar el problema de longitud de cadena. Lo que estoy preguntando es cómo obtengo el nombre exacto del campo que está rompiendo el modelo.


La mejor solución, en mi opinión, es manejar este tipo de errores de forma centralizada.

simplemente agregue este método a la clase principal DbContext :

public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException ex) { string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage)); throw new DbEntityValidationException(errorMessages); } }

Esto sobrescribirá el método SaveChanges() su contexto y obtendrá una lista separada por comas que contiene todos los errores de validación de la entidad.

Espero que esto sea útil.


Me resultó útil crear un contenedor SaveChanges que hace que EntityValidationErrors sea más legible:

Public Sub SaveChanges(entities As Entities) Try entities.SaveChanges() Catch ex As DbEntityValidationException Dim msg As New StringBuilder msg.AppendLine(ex.Message) For Each vr As DbEntityValidationResult In ex.EntityValidationErrors For Each ve As DbValidationError In vr.ValidationErrors msg.AppendLine(String.Format("{0}: {1}", ve.PropertyName, ve.ErrorMessage)) Next Next Throw New DbEntityValidationException(msg.ToString, ex.EntityValidationErrors, ex) End Try End Sub

y luego cambió ''entities.SaveChanges ()'' a ''SaveChanges (entities)'' en todo mi proyecto


Mientras estás en el modo de depuración dentro del bloque catch {...} abre la ventana "QuickWatch" ( ctrl + alt + q ) y pega allí:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

Esto le permitirá profundizar en el árbol ValidationErrors . Es la forma más fácil que he encontrado para obtener una visión instantánea de estos errores.

Para usuarios de Visual 2012+ que solo se preocupan por el primer error y que quizás no tengan un bloque catch , incluso pueden hacer:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage


Podrías probar esto en un bloque try / catch?

catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } }