Je suis perdu pour ça:
J'ai défini mes classes pour une approche de code du framework d'entité (4.1.3). Tout allait bien (je créais les tables, etc.) jusqu'à ce que je commence à semer.
Maintenant, quand je fais le
Add-Migration "remigrate" ; Update-Database;
J'obtiens une erreur sur la console du package "La validation a échoué pour une ou plusieurs entités. Voir la propriété 'EntityValidationErrors' pour plus de détails."
J'ai un point d'arrêt dans ma méthode Seed () mais parce que j'exécute ceci sur la console lorsque le projet n'est pas en cours d'exécution, je ne sais pas comment accéder aux détails (PS - j'ai vu le thread La validation a échoué pour une ou plusieurs entités lors de l'enregistrement des modifications dans la base de données SQL Server à l'aide d'Entity Framework qui montre comment je peux voir la propriété.)
Je sais que ma méthode Seed () a un problème car si je mets un retour juste après l'appel de méthode, l'erreur disparaît. Alors, comment définir mon point d'arrêt pour voir quelle est l'erreur de validation? Un peu perdu. Ou y a-t-il un autre moyen de le retracer dans la console nuget?
Réponses:
J'ai aussi été ennuyé par cela récemment. Je l'ai corrigé en mettant une fonction wrapper dans la classe Configuration de la méthode Seed et en remplaçant les appels à
SaveChanges
par des appels à ma fonction à la place. Cette fonction énumérerait simplement les erreurs dans laEntityValidationErrors
collection et relancerait une exception où le message Exception répertorie les problèmes individuels. Cela fait apparaître la sortie dans la console du gestionnaire de packages NuGet.Le code suit:
Remplacez simplement les appels à
context.SaveChanges()
parSaveChanges(context)
dans votre méthode de départ.la source
public override int SaveChanges()
dans le contexte.Étendez déjà votre classe DBContext avec une définition de classe partielle!
Si vous regardez la définition de classe pour votre DbContext, ce sera quelque chose comme ceci:
Ainsi, dans un autre fichier, vous pouvez créer la même définition et remplacer les parties que vous souhaitez.
L'idée générale avec des classes partielles - avez-vous remarqué que DbContext est une classe partielle - est que vous pouvez étendre une classe qui a été générée (ou organiser les classes en plusieurs fichiers) et dans notre cas, nous voulons également remplacer la méthode SaveChanges à partir d'une classe partielle qui ajoute au DbContext .
De cette façon, nous pouvons obtenir des informations de débogage d'erreur à partir de tous les appels DbContext / SaveChanges existants partout et ne pas avoir à changer votre code de démarrage ou votre code de développement du tout.
Voilà ce que je ferais ( NOTE la différence est que je viens de passer outre la méthode SaveChanges dans la notre propre auteur DbContext classe partielle, pas CELUI GÉNÉRÉ ). Assurez-vous également que votre classe partielle utilise l' espace de noms correct, sinon vous vous cognerez la tête contre le mur.
la source
J'ai converti la réponse de Richard en une méthode d'extension:
Appelez comme ceci:
la source
J'ai converti la version de craigvl en C #, j'ai dû ajouter context.SaveChanges (); pour que cela fonctionne pour moi comme ci-dessous.
la source
Richard merci de m'avoir mis sur le bon chemin (a eu le même problème) ci-dessous est une alternative sans le wrapper qui a fonctionné pour moi dans la méthode de départ de configuration de migration:
Était alors en mesure de voir l'exception dans la console du gestionnaire de packages. J'espère que cela aide quelqu'un.
la source
la source