Dafür bin ich ratlos:
Ich habe meine Klassen für einen Code-First-Ansatz für Entity Framework (4.1.3) definiert. Alles war in Ordnung (ich habe die Tabellen usw. erstellt), bis ich anfing zu säen.
Jetzt, wenn ich das mache
Add-Migration "remigrate" ; Update-Database;
Auf der Paketkonsole wird die Fehlermeldung "Die Überprüfung für eine oder mehrere Entitäten ist fehlgeschlagen. Weitere Informationen finden Sie in der Eigenschaft 'EntityValidationErrors'."
Ich habe einen Haltepunkt in meiner Seed () -Methode, aber da ich diesen auf der Konsole ausführe, wenn das Projekt nicht ausgeführt wird, weiß ich nicht, wie ich zu den Details komme (PS - Ich habe gesehen, dass die Thread- Validierung fehlgeschlagen ist für eine oder mehrere Entitäten beim Speichern von Änderungen an der SQL Server-Datenbank mithilfe von Entity Framework, das zeigt, wie ich die Eigenschaft sehen kann.)
Ich weiß, dass meine Seed () -Methode ein Problem hat, denn wenn ich direkt nach dem Methodenaufruf eine Rückgabe mache, verschwindet der Fehler. Wie setze ich meinen Haltepunkt, damit ich den Validierungsfehler sehen kann? Ein bisschen verloren. Oder gibt es eine andere Möglichkeit, es in der Nuget-Konsole zu verfolgen?
Antworten:
Das hat mich in letzter Zeit auch geärgert. Ich habe das Problem behoben, indem ich in der Seed-Methode eine Wrapper-Funktion in die Configuration-Klasse eingefügt und
SaveChanges
stattdessen Aufrufe von durch Aufrufe meiner Funktion ersetzt habe. Diese Funktion würde einfach die Fehler in derEntityValidationErrors
Sammlung auflisten und eine Ausnahme erneut auslösen, in der die Ausnahmemeldung die einzelnen Probleme auflistet. Dadurch wird die Ausgabe in der NuGet-Paketmanagerkonsole angezeigt.Code folgt:
Ersetzen Sie einfach Aufrufe von
context.SaveChanges()
durchSaveChanges(context)
in Ihrer Seed-Methode.quelle
public override int SaveChanges()
im Kontext.Erweitern Sie Ihre DBContext-Klasse bereits mit einer Teilklassendefinition!
Wenn Sie sich die Klassendefinition für Ihren DbContext ansehen, sieht sie ungefähr so aus:
In einer anderen Datei können Sie also dieselbe Definition erstellen und die gewünschten Teile überschreiben.
Die ganze Idee mit Teilklassen - haben Sie bemerkt, dass der DbContext eine Teilklasse ist - ist, dass Sie eine generierte Klasse erweitern (oder Klassen in mehreren Dateien organisieren) können. In unserem Fall möchten wir auch die SaveChanges- Methode überschreiben aus einer Teilklasse heraus , die dem DbContext hinzugefügt wird .
Auf diese Weise können wir Fehler-Debugging-Informationen von allen vorhandenen DbContext / SaveChanges-Aufrufen überall erhalten und müssen Ihren Seed-Code oder Entwicklungscode überhaupt nicht ändern.
Dies ist, was ich tun würde ( HINWEIS: Der Unterschied besteht darin, dass ich die SaveChanges-Methode in unserer eigenen DbContext-Teilklasse überschreibe , NICHT in der GENERIERTEN ). Stellen Sie außerdem sicher, dass Ihre Teilklasse den richtigen Namespace verwendet, da Sie sonst Ihren Kopf gegen die Wand schlagen.
quelle
Ich habe Richards Antwort in eine Erweiterungsmethode konvertiert:
Rufen Sie so an:
quelle
Ich habe die Version von craigvl in C # konvertiert. Ich musste context.SaveChanges () hinzufügen. damit es für mich wie unten funktioniert.
quelle
Richard, danke, dass Sie mich auf den richtigen Weg gebracht haben (hatte das gleiche Problem). Dies ist eine Alternative ohne den Wrapper, der bei der Seed-Methode für die Migrationskonfiguration für mich funktioniert hat:
Konnte dann die Ausnahme in der Paketmanager-Konsole sehen. Hoffe das hilft jemandem.
quelle
quelle