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.

394voto

GONeale Points 9432

Lorsque vous êtes en mode débogage dans l'application catch {...} ouvrir la fenêtre "QuickWatch" ( ctrl + alt + q ) et collez-y :

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

Cela vous permettra d'accéder à la ValidationErrors arbre. C'est le moyen le plus simple que j'ai trouvé pour avoir un aperçu instantané de ces erreurs.

Pour les utilisateurs de Visual 2012+ qui ne s'intéressent qu'à la première erreur et qui n'ont pas forcément une catch bloc, vous pouvez même le faire :

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

9 votes

C'est mieux que l'autre réponse :)

99 votes

Si vous n'avez pas de bloc de capture, vous pouvez remplacer ex con $exception et obtenir le même résultat.

0 votes

Assurez-vous également de remplacer ex avec w/e votre catch (Exception THIS) est

124voto

Trent Scholl Points 1595

Vous pourriez essayer ceci dans un bloc 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);
        }
    }
}

14voto

Chtiwi Malek Points 1574

La meilleure solution, à mon avis, est de traiter ce genre d'erreurs de manière centralisée.

il suffit d'ajouter cette méthode à la méthode principale DbContext classe :

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

Cela va écraser le fichier de votre contexte SaveChanges() et vous obtiendrez une liste séparée par des virgules contenant toutes les erreurs de validation de l'entité.

J'espère que cela vous sera utile.

4voto

J'ai eu le même problème. Mon modèle fonctionnait bien dans EF CTP5 mais ne s'est pas construit dans 4.1 avec la même erreur ""Validation failed for one or more entities" lorsque j'ai essayé de l'initialiser. Je me suis rendu compte que j'avais une propriété :

public string Comment {get; set;}

Ensuite, dans la méthode seed de l'initialisateur surchargé, j'avais un commentaire assez long (environ 600 lettres).

Je pense que le problème est le suivant : dans EF 4.1 vous ont pour définir explicitement les annotations de données dans certains cas. Pour moi, la définition de :

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

aidé. C'est bizarre puisque la CTP5 n'avait aucun problème avec ça.

0 votes

Ce que je voulais savoir, c'est comment obtenir le nom exact de la propriété qui casse le modèle. Cependant, j'ai réussi à résoudre le problème que vous avez mentionné en utilisant [StringLength(Int32.MaxValue)] comme attribut pour ma propriété (comme cela a été suggéré par Ladislav Mrnka et j'en ai parlé dans cette question). stackoverflow.com/questions/5346155/ ) Bonne chance ! =)

0 votes

Cela s'est produit lorsque j'ai ajouté une nouvelle propriété à mon modèle dans la version 4.1. Cela fonctionnait parfaitement dans la version 4.1 auparavant. Bizarre. Résolu en ajoutant une annotation à toutes les propriétés du modèle.

4voto

Mikael Edebro Points 108

Il s'est avéré que c'était une erreur stupide. L'un des messages que j'essayais de mettre à jour comportait un champ avec trop de caractères. J'avais accepté 100 caractères à l'origine, mais j'ai ensuite changé pour 70, et l'ancien message avec plus de 70 caractères déclenchait l'erreur.

Merci de votre aide en tout cas ! Je l'apprécie vraiment !

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