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