c# - first - entity framework download




DbEntityValidationException-Wie kann ich leicht erkennen, was den Fehler verursacht hat? (6)

Die einfachste Lösung besteht darin, SaveChanges für Ihre SaveChanges zu überschreiben. Sie können die DbEntityValidationException abfangen, die tatsächlichen Fehler entfernen und eine neue DbEntityValidationException mit der verbesserten Nachricht erstellen.

  1. Erstellen Sie eine Teilklasse neben Ihrer SomethingSomething.Context.cs-Datei.
  2. Verwenden Sie den Code am Ende dieses Posts.
  3. Das ist es. Ihre Implementierung verwendet automatisch die überschriebenen SaveChanges ohne Refactor-Arbeit.

Ihre Ausnahmebedingungsnachricht sieht jetzt so aus:

System.Data.Entity.Validation.DbEntityValidationException: Die Überprüfung für eine oder mehrere Entitäten ist fehlgeschlagen. Weitere Informationen finden Sie unter Eigenschaft 'EntityValidationErrors'. Die Überprüfungsfehler sind: Das Feld PhoneNumber muss ein String- oder Array-Typ mit einer maximalen Länge von 12 sein. Das Feld LastName ist erforderlich.

Sie können die überschriebenen SaveChanges in jeder Klasse DbContext , die von DbContext erbt:

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);
        }
    }
}

Die 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 über diese Entitäten auszugeben.

Siehe auch: http://devillers.nl/improving-dbentityvalidationexception/

Ich habe ein Projekt, das Entity Framework verwendet. Beim Aufruf von SaveChanges auf meinem DbContext ich folgende Ausnahme:

System.Data.Entity.Validation.DbEntityValidationException: Die Überprüfung für eine oder mehrere Entitäten ist fehlgeschlagen. Weitere Informationen finden Sie unter Eigenschaft 'EntityValidationErrors'.

Das ist alles gut und schön, aber ich möchte nicht jedes Mal einen Debugger anhängen, wenn diese Ausnahme auftritt. Darüber hinaus kann ich in Produktionsumgebungen einen Debugger nicht ohne weiteres anhängen, weshalb ich große Anstrengungen unternehmen muss, um diese Fehler zu reproduzieren.

Wie kann ich die in der DbEntityValidationException versteckten Details DbEntityValidationException ?


Eigentlich ist dies nur das Validierungsproblem. EF überprüft zuerst die Entitätseigenschaften, bevor Änderungen an der Datenbank vorgenommen werden. EF überprüft also, ob der Wert der Eigenschaft außerhalb des Bereichs liegt, wie bei der Erstellung der Tabelle. Table_Column_UserName ist varchar (20). In EF haben Sie jedoch einen Wert eingegeben, der länger als 20 ist. Oder in anderen Fällen, wenn die Spalte keine Null zulässt. Daher müssen Sie im Validierungsprozess einen Wert für die Nicht-Null-Spalte festlegen, unabhängig davon, ob Sie die Änderung daran vornehmen. Ich persönlich, wie die Leniel Macaferi Antwort. Es kann Ihnen die Details der Validierungsprobleme zeigen


Ich denke, dass "die tatsächlichen Validierungsfehler" vertrauliche Informationen enthalten können, und dies könnte der Grund sein, warum Microsoft entschied, sie an einem anderen Ort (Eigenschaften) zu platzieren. Die hier markierte Lösung ist praktisch, sollte aber mit Vorsicht verwendet werden.

Ich würde es vorziehen, eine Erweiterungsmethode zu erstellen. Weitere Gründe dafür:

  • Original-Stack-Trace beibehalten
  • Folgen Sie offen / geschlossen Prinzip (dh .: Ich kann verschiedene Nachrichten für verschiedene Arten von Protokollen verwenden)
  • In Produktionsumgebungen kann es andere Stellen (z. B. anderen dbcontext) geben, wo eine DbEntityValidationException ausgelöst werden könnte.

So finden Sie schnell eine sinnvolle Fehlermeldung, indem Sie den Fehler während des Debuggens untersuchen:

  • Fügen Sie eine schnelle Überwachung hinzu für:

    ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
    
  • Drilldown in EntityValidationErrors wie folgt:

    (Sammlungselement zB [0])> ValidationErrors> (Sammlungselement zB [0])> ErrorMessage


Verwenden Sie try Block in Ihrem Code wie

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges

    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

Sie können die Details hier auch überprüfen

  1. http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

  2. Die Validierung ist für eine oder mehrere Entitäten fehlgeschlagen. Weitere Informationen finden Sie unter Eigenschaft 'EntityValidationErrors'

  3. http://blogs.infosupport.com/improving-dbentityvalidationexception/


Während Sie sich im Debug-Modus im catch {...} Block catch {...} , öffnen Sie das Fenster "QuickWatch" ( Strg + Alt + Q ) und fügen Sie dort ein:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

Auf diese Weise können Sie einen Drilldown in die ValidationErrors Struktur durchführen. Es ist der einfachste Weg, den ich gefunden habe, um einen sofortigen Einblick in diese Fehler zu bekommen.

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 Folgendes tun:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage




entity-framework