Die einfachste Lösung besteht darin, SaveChanges
Ihre Entitätsklasse zu überschreiben . Sie können die DbEntityValidationException
Fehler abfangen , auspacken und DbEntityValidationException
mit der verbesserten Nachricht eine neue erstellen .
- Erstellen Sie eine Teilklasse neben Ihrer Datei SomethingSomething.Context.cs.
- Verwenden Sie den Code am Ende dieses Beitrags.
- Das ist es. Ihre Implementierung verwendet die überschriebenen SaveChanges automatisch ohne Refactor-Arbeit.
Ihre Ausnahmemeldung sieht nun folgendermaßen aus:
System.Data.Entity.Validation.DbEntityValidationException: Die Validierung für eine oder mehrere Entitäten ist fehlgeschlagen. Weitere Informationen finden Sie unter der Eigenschaft 'EntityValidationErrors'. Die Validierungsfehler sind: Das Feld PhoneNumber muss ein String- oder Array-Typ mit einer maximalen Länge von '12' sein. Das Feld Nachname ist erforderlich.
Sie können die überschriebenen SaveChanges in jeder Klasse löschen, die von Folgendem erbt 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);
}
}
}
Das DbEntityValidationException
enthält auch die Entitäten, die die Validierungsfehler verursacht haben. Wenn Sie also noch mehr Informationen benötigen, können Sie den obigen Code ändern, um Informationen zu diesen Entitäten auszugeben.
Siehe auch: http://devillers.nl/improving-dbentityvalidationexception/
using System.Linq;
Wie Martin angedeutet hat, gibt es weitere Informationen in der
DbEntityValidationResult
. Ich fand es nützlich, in jeder Nachricht sowohl meinen POCO-Klassennamen als auch meinen Eigenschaftsnamen abzurufen, und wollte vermeiden, dassErrorMessage
ich[Required]
nur dafür benutzerdefinierte Attribute auf alle meine Tags schreiben muss .Die folgende Änderung an Martins Code hat sich für mich um diese Details gekümmert:
quelle
SelectMany and Aggregate
in Github von Daring CodersFügen Sie dem
EntityValidationErrors
Überwachungsfenster den folgenden Überwachungsausdruck hinzu, um die Sammlung anzuzeigen .Ich benutze Visual Studio 2013
quelle
catch {...}
Öffnen Sie im Debug-Modus innerhalb des Blocks das Fenster "QuickWatch" ( ctrl+ alt+ q) und fügen Sie es dort ein:Auf diese Weise können Sie einen Drilldown in den
ValidationErrors
Baum durchführen. Dies ist der einfachste Weg, um sofort einen Einblick in diese Fehler zu erhalten.Für Benutzer von Visual 2012+, die sich nur um den ersten Fehler kümmern und möglicherweise keinen
catch
Block haben, können Sie sogar Folgendes tun:quelle
So finden Sie schnell eine aussagekräftige Fehlermeldung, indem Sie den Fehler beim Debuggen untersuchen:
Fügen Sie eine schnelle Uhr hinzu für:
Führen Sie einen Drilldown in EntityValidationErrors wie folgt durch:
(Sammlungselement zB [0])> ValidationErrors> (Sammlungselement zB [0])> ErrorMessage
quelle
Tatsächlich ist dies nur das Validierungsproblem. EF validiert zuerst die Entitätseigenschaften, bevor Änderungen an der Datenbank vorgenommen werden. Daher prüft EF, ob der Wert der Eigenschaft außerhalb des Bereichs liegt, wie beim Entwerfen der Tabelle. Table_Column_UserName ist varchar (20). In EF haben Sie jedoch einen Wert eingegeben, der länger als 20 ist. In anderen Fällen, wenn die Spalte keine Null zulässt. Während des Validierungsprozesses müssen Sie also einen Wert auf die Spalte nicht null setzen, unabhängig davon, ob Sie die Änderung daran vornehmen möchten. Ich persönlich mag die Antwort von Leniel Macaferi. Es kann Ihnen die Details der Validierungsprobleme zeigen
quelle
Ich denke, "Die tatsächlichen Validierungsfehler" können vertrauliche Informationen enthalten, und dies könnte der Grund sein, warum Microsoft sie an einem anderen Ort (Eigenschaften) abgelegt hat. Die hier gekennzeichnete Lösung ist praktisch, sollte jedoch mit Vorsicht angewendet werden.
Ich würde es vorziehen, eine Erweiterungsmethode zu erstellen. Weitere Gründe dafür:
quelle
Für Azure-Funktionen verwenden wir diese einfache Erweiterung für Microsoft.Extensions.Logging.ILogger
und Verwendungsbeispiel:
quelle
Verwenden Sie try block in Ihrem Code wie
Sie können die Details auch hier überprüfen
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Die Validierung für eine oder mehrere Entitäten ist fehlgeschlagen. Weitere Informationen finden Sie unter der Eigenschaft 'EntityValidationErrors'
http://blogs.infosupport.com/improving-dbentityvalidationexception/
quelle