wake-up-neo.com

Abrufen des genauen Fehlertyps von DbValidationException

Ich habe die Situation, in der ich mein Modell in DatabaseInitializer () für EF 4.1 initialisiere und diesen ärgerlichen Fehler erhalte "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details." Also gehe ich zu diesem EntityValidationErrors und es gibt ein Feld {System.Data.Entity.Validation.DbEntityValidationResult}, das mir keinerlei Informationen darüber gibt, welches Feld nicht initialisiert werden konnte. Gibt es eine Möglichkeit, weitere Informationen zu diesem Fehler zu erhalten?

Zum Aufräumen:

Ich weiß, wie man das Stringlängenproblem behebt. Was ich frage, ist, wie ich den genauen Feldnamen erhalte, der das Modell bricht.

183
Nazar Gargol

Während Sie sich im Debug-Modus innerhalb des catch {...} block öffne das "QuickWatch" -Fenster (ctrl+alt+q) und dort einfügen:

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

Auf diese Weise können Sie einen Drilldown in den ValidationErrors -Baum durchführen. Es ist der einfachste Weg, einen sofortigen Einblick in diese Fehler zu bekommen.

Für Benutzer von Visual 2012+, denen nur der erste Fehler wichtig ist und die möglicherweise keinen catch -Block haben, können Sie sogar Folgendes tun:

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

Sie könnten dies in einem Try/Catch-Block versuchen?

catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}
123
Trent Scholl

Die beste Lösung ist meiner Meinung nach, diese Art von Fehlern zentral zu behandeln.

füge einfach diese Methode zur Klasse DbContext hinzu:

public override int SaveChanges()
{
    try
    {
        return base.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage));
        throw new DbEntityValidationException(errorMessages);
    }
}

Dies überschreibt die SaveChanges() -Methode Ihres Kontexts und Sie erhalten eine durch Kommas getrennte Liste mit allen Entitätsprüfungsfehlern.

hoffe das ist hilfreich.

10
Chtiwi Malek

Nun, ich hatte das gleiche Problem. Mein Modell funktionierte in EF CTP5 einwandfrei, konnte jedoch 4.1 nicht mit demselben Fehler "" Validierung für eine oder mehrere Entitäten fehlgeschlagen ", als ich versuchte, es zu initialisieren. Ich stellte fest, dass ich Eigentum hatte:

public string Comment {get; set;}

Dann hatte ich in der Seed-Methode im überschriebenen Initializer einen ziemlich langen Kommentar (ungefähr 600 Buchstaben).

Ich denke, der Punkt ist: In EF 4.1 müssen, um Datenanmerkungen in einigen Fällen explizit festzulegen. Für mich Einstellung:

[StringLength(4000)] 
public string Comment {get; set;}

geholfen Es ist komisch, da CTP5 damit keine Probleme hatte.

4

Ich fand es nützlich, einen SaveChanges-Wrapper zu erstellen, der die EntityValidationErrors lesbarer macht:

Public Sub SaveChanges(entities As Entities)

    Try
        entities.SaveChanges()

    Catch ex As DbEntityValidationException

        Dim msg As New StringBuilder
        msg.AppendLine(ex.Message)

        For Each vr As DbEntityValidationResult In ex.EntityValidationErrors
            For Each ve As DbValidationError In vr.ValidationErrors
                msg.AppendLine(String.Format("{0}: {1}", ve.PropertyName, ve.ErrorMessage))
            Next
        Next

        Throw New DbEntityValidationException(msg.ToString, ex.EntityValidationErrors, ex)

    End Try

End Sub

und dann in meinem gesamten Projekt "entity.SaveChanges ()" in "saveChanges (entity)" geändert

1
smirkingman