200 votes

Obtenir le type d'erreur exact dans DbValidationException

Je suis dans la situation où j'initialise mon modèle dans DatabaseInitializer() pour EF 4.1 et j'obtiens cette erreur ennuyeuse "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details." Donc, je vais dans cette EntityValidationErrors et il y a un champ {System.Data.Entity.Validation.DbEntityValidationResult} qui ne me donne aucune information sur le champ qu'il n'a pas pu initialiser. Existe-t-il un moyen d'obtenir plus d'informations sur cette erreur ?

Pour mettre les choses au clair :

Je sais comment résoudre le problème de la longueur de la chaîne. Ce que je demande, c'est comment obtenir le nom exact du champ qui casse le modèle.

2voto

NikiUsefi Points 507

Je sais que c'est une vieille question mais voici ma réponse :

catch (DbEntityValidationException ex)
   {
    String.Join("\n", ex.EntityValidationErrors
          .SelectMany(x => x.ValidationErrors)
          .Select(x => x.ErrorMessage)
          .ToArray());
   }

et si vous utilisez le code en premier, vous pouvez aussi globaliser vos messages d'erreur en utilisant plusieurs fichiers de ressources

Par exemple, j'ai deux fichiers de ressources distincts, l'un pour les erreurs et l'autre pour les noms de propriétés, et je les utilise comme suit : enter image description here enter image description here

public class Person 
    {
        [Required(ErrorMessageResourceName = "required",ErrorMessageResourceType =typeof(ErrorMessages))]
        [MaxLength(100,ErrorMessageResourceName = "maxLength", ErrorMessageResourceType = typeof(ErrorMessages))]
        [Display(Name = "FirstName",ResourceType = typeof(Properties))]
        public string FirstName { get; set; }
         }

Comme vous pouvez le voir, j'ai entièrement traduit mes messages d'erreur, y compris les noms des propriétés, afin de pouvoir les utiliser ultérieurement dans l'utilisateur, par exemple :

enter image description here

1voto

smirkingman Points 3117

J'ai trouvé utile de créer un wrapper SaveChanges qui rend les EntityValidationErrors plus lisibles :

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

puis j'ai remplacé "entities.SaveChanges()" par "SaveChanges(entities)" dans tout mon projet.

0voto

HamsterLabs Points 15

Vérifiez que tous les champs que vous essayez d'enregistrer et qui ne peuvent pas être annulés ont des valeurs. Cela peut prendre moins de temps que de comprendre les messages d'erreur énigmatiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X