La solution la plus simple consiste à remplacer SaveChanges
votre classe d'entités. Vous pouvez attraper le DbEntityValidationException
, déballer les erreurs réelles et en créer un nouveau DbEntityValidationException
avec le message amélioré.
- Créez une classe partielle à côté de votre fichier SomethingSomething.Context.cs.
- Utilisez le code au bas de cet article.
- C'est tout. Votre implémentation utilisera automatiquement les SaveChanges remplacés sans aucun travail de refactorisation.
Votre message d'exception ressemblera maintenant à ceci:
System.Data.Entity.Validation.DbEntityValidationException: la validation a échoué pour une ou plusieurs entités. Voir la propriété 'EntityValidationErrors' pour plus de détails. Les erreurs de validation sont les suivantes: Le champ PhoneNumber doit être une chaîne ou un type de tableau d'une longueur maximale de '12'; Le champ LastName est obligatoire.
Vous pouvez supprimer les SaveChanges substitués dans n'importe quelle classe qui hérite de DbContext
:
public partial class SomethingSomethingEntities
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}
Le DbEntityValidationException
contient également les entités qui ont provoqué les erreurs de validation. Donc, si vous avez besoin de plus d'informations, vous pouvez modifier le code ci-dessus pour afficher des informations sur ces entités.
Voir aussi: http://devillers.nl/improving-dbentityvalidationexception/
Martin Devillers
la source
using System.Linq;
Comme Martin l'a indiqué, il y a plus d'informations dans le
DbEntityValidationResult
. J'ai trouvé utile d'obtenir à la fois le nom de ma classe POCO et le nom de la propriété dans chaque message, et je voulais éviter d'avoir à écrire desErrorMessage
attributs personnalisés sur toutes mes[Required]
balises juste pour cela.La modification suivante du code de Martin a pris soin de ces détails pour moi:
la source
SelectMany and Aggregate
dans github par Daring CodersPour afficher la
EntityValidationErrors
collection, ajoutez l'expression Watch suivante à la fenêtre Watch.J'utilise Visual Studio 2013
la source
Pendant que vous êtes en mode débogage dans le
catch {...}
bloc, ouvrez la fenêtre "QuickWatch" ( ctrl+ alt+ q) et collez-y:Cela vous permettra de forer dans l'
ValidationErrors
arbre. C'est le moyen le plus simple que j'ai trouvé pour obtenir un aperçu instantané de ces erreurs.Pour les utilisateurs de Visual 2012+ qui ne se soucient que de la première erreur et qui pourraient ne pas avoir de
catch
bloc, vous pouvez même faire:la source
Pour trouver rapidement un message d'erreur significatif en inspectant l'erreur pendant le débogage:
Ajoutez une veille rapide pour:
Accédez à EntityValidationErrors comme ceci:
(élément de collection, par exemple [0])> ValidationErrors> (élément de collection, par exemple [0])> ErrorMessage
la source
En fait, ce n'est que le problème de validation, EF validera d'abord les propriétés de l'entité avant d'apporter des modifications à la base de données. Ainsi, EF vérifiera si la valeur de la propriété est hors limites, comme lorsque vous avez conçu la table. Table_Column_UserName est varchar (20). Mais, dans EF, vous avez entré une valeur supérieure à 20. Ou, dans d'autres cas, si la colonne ne permet pas d'être Null. Ainsi, dans le processus de validation, vous devez définir une valeur dans la colonne non nulle, que vous y apportiez ou non la modification. Personnellement, j'aime la réponse de Leniel Macaferi. Il peut vous montrer le détail des problèmes de validation
la source
Je pense que "les erreurs de validation réelles" peuvent contenir des informations sensibles, et cela pourrait être la raison pour laquelle Microsoft a choisi de les mettre à un autre endroit (propriétés). La solution indiquée ici est pratique, mais elle doit être prise avec prudence.
Je préférerais créer une méthode d'extension. Plus de raisons à cela:
la source
Pour Azure Functions, nous utilisons cette simple extension de Microsoft.Extensions.Logging.ILogger
et exemple d'utilisation:
la source
Utilisez le bloc try dans votre code comme
Vous pouvez également vérifier les détails ici
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
La validation a échoué pour une ou plusieurs entités. Voir la propriété 'EntityValidationErrors' pour plus de détails
http://blogs.infosupport.com/improving-dbentityvalidationexception/
la source