Trouver la raison pour DBUpdateException
Lors de l'appel de DbContext.SaveChanges
, je reçois un DbUpdateException:
Une exception non gérée du type
'Système.Les données.De l'entité.L'Infrastructure.DbUpdateException' s'est produite dans
EntityFramework.dll. Informations supplémentaires: Une erreur s'est produite lors
la mise à jour de la liste des entrées. Voir l'exception interne pour plus de détails.
Malheureusement, il n'y a pas d'exception interne (au moins, pas autant que je peux voir). Est-il possible de voir exactement pourquoi SaveChanges
a déclenché une exception? À tout le moins, il serait utile de voir ce que la table SaveChanges essayé de mettre à jour lorsque l'erreur s'est produite.
- Avez-vous essayé d'exécuter le code dans une session de débogage avec l'option d'arrêter dès qu'une exception est levée (première chance ex)?
- S'il vous plaît montrer une capture d'écran d'au moins
- Ouvrir un générateur de profils SQL et d'exécuter votre application jusqu'à ce que vous obtenez à l'exception à nouveau. Regardez profiler et dernière SQL envoyé à partir de votre application sur le Serveur SQL.
- Aussi regarder DbUpdateException.Les entrées de la Propriété msdn.microsoft.com/en-us/library/...
- Essayé ta suggestion (coché la case "Pause lorsque ce exc type est levée" de la boîte), et maintenant un
$exception
valeur s'affiche dans les "Habitants" volet, avec tous les détails que je cherchais. Thx! - Je l'ai ajouté comme une réponse. Vous êtes les bienvenus.
- J'ai le même problème, mais ne pas apparaître toutes les "Locaux" lorsque l'exception est interceptée et je choisissez l'action "Afficher le Détail..." dans Visual Studio
- Si vous utilisez Entity Framework vous pouvez avoir un coup d'oeil à ma réponse sur Solution pour la “Validation a échoué à une ou plusieurs entités. Voir " EntityValidationErrors la propriété pour plus de détails. Espérons que cela aide...
Vous devez vous connecter pour publier un commentaire.
Quand il semble que la véritable exception est perdu quelque part, votre meilleur pari est de briser à chaque exception. Peu importe s'il est atteint, ou avalé quelque part, dans ou hors de votre portée, le débogueur s'arrête et vous permettra de voir ce qu'il se passe.
Voir ce lien MSDN pour plus d'info:
Comment faire: Casser Quand une Exception est Levée
C'est mon substitution de SaveChanges. Il me donne une place utile pour mettre des points d'arrêt:
Référence:
La Validation a échoué pour une ou plusieurs entités. Voir " EntityValidationErrors la propriété pour plus de détails
Voici mon substitution de SaveChanges, montrant le code supplémentaire pour faire face à la DbUpdateException (selon la question).
Je n'ai pas fait le code d'enregistrement très précis, mais il améliore le message d'erreur standard de quelque chose comme:
De cette façon, au moins je peux voir l'entité qui a le problème, et c'est normalement suffisant pour s'en sortir.
throw;
au lieu dethrow exception;
. Le plus tard réinitialise l'ensemble de la trace de la pile qui permet de trouver le problème d'origine beaucoup plus difficile dans le code si vous essayez de les manipuler ou de les enregistrer plus tard.Basé sur de Colin de répondre pleinement des informations détaillées sur les EF persistance de l'échec peut être fourni comme ceci:
À côté des erreurs de validation, de mise à jour exception de sortie à la fois générale d'erreur et les informations de contexte.
Remarque: C# 6.0 est requis pour que ce code fonctionne, car il utilise null propagation et de la chaîne d'interpolation.
Pour .NET de Base le code est légèrement changé depuis possible ont soulevé des exceptions ont une structure différente /sont remplis différemment:
Le Contexte peut être amélioré pour rejeter automatiquement les modifications sur l'échec, si le contexte n'est pas immédiatement éliminés:
DbUpdateException
je connectez-vous simplementexc?.InnerException?.Message}
(Entries
n'est plus utilisé. Je vais ajouter une réponse distincte pour .NET de Base car il est tout à fait différent .NETEntries
aurait de la magie de l'information en elle 🙂J'ai eu le même message d'erreur "La conversion d'un datetime2 type de données à un type de données datetime entraîné dans une gamme de valeur.\r\nle instruction a été arrêtée."
J'ai mis la valeur Datetime domaine comme celui-ci Datetime.Maintenant
J'ai eu la même erreur et résoudre comme ça;
J'ai un champ de type de données est de type datetime et j'ai conscience que je suis en train d'elle sans datetime propriété. J'ai donc changer pour "Datetime.Maintenant" puis-je voir le problème a été résolu et il a été sauvé le fait
Dans mon cas, j'ai été en utilisant la Procédure Stockée pour ajouter une entité à DB. Ma SP est de donner le runtime erreur à cause de laquelle j'ai été faire cette erreur en C#. J'ai corrigé la SP et de l'EF a parfaitement fonctionné.
Donc, si vous faites usage de la SP pour ajouter,modifier,supprimer ou mettre à jour en EF vérifier si le correspondant sp fonctionne correctement.