2011-03-17 12 views
172

ho la situazione in cui sto inizializzazione il mio modello in DatabaseInitializer() per EF 4.1 e ottenere questo fastidioso errore "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details." Così, vado a questo EntityValidationErrors e non v'è un campo che mi dà {System.Data.Entity.Validation.DbEntityValidationResult} nessuna informazione su quale campo non è stato in grado di inizializzare. C'è un modo per ottenere maggiori informazioni su questo errore?Ottenere tipo di errore esatto dal DbValidationException

Per cancellare le cose:

so come risolvere il problema lunghezza della stringa. Quello che sto chiedendo è come ottengo il nome esatto del campo che sta infrangendo il modello.

risposta

355

Mentre si è in modalità debug all'interno del blocco catch {...} aprire la finestra "Controllo immediato" (Ctrl + alt + q) e incollarlo in là:

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

Questo ti consentirà di eseguire il drill down nell'albero ValidationErrors. È il modo più semplice che ho trovato per ottenere una visione immediata di questi errori.

per Visual 2012+ gli utenti che si preoccupano solo il primo errore e potrebbero non avere un blocco catch, si può anche fare:

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

Questa è migliore dell'altra risposta :) – Doug

+93

Se non si dispone di un blocco catch, è possibile sostituire 'ex' con' $ exception' e ottenere lo stesso risultato. – Ecyrb

+0

assicurati anche di sostituire 'ex' con w/e il tuo' catch (Exception THIS) 'è – Eonasdan

4

Bene, ho avuto lo stesso problema. . Il mio modello ha lavorato bene in EF CTP5 ma non è riuscito a costruire in 4.1 con lo stesso errore "" Validazione fallita per una o più entità" quando ho provato a inizializzare lo ho capito che avevo proprietà:

public string Comment {get; set;} 

Poi nel metodo di seme in inizializzatore overrided, ho avuto molto tempo (circa 600 lettere) un commento un po '

credo che il punto è:.. in EF 4.1 si avete impostare le annotazioni di dati in modo esplicito in alcuni casi per me, l'impostazione :

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

aiutato. È strano dal momento che CTP5 non ha avuto problemi con questo.

+0

Bene, quello che stavo chiedendo è come ottengo il nome esatto della proprietà che sta infrangendo il modello. Tuttavia, sono riuscito a superare il problema che hai dichiarato usando [StringLength (Int32.MaxValue)] come attributo per la mia proprietà (come suggerito da Ladislav Mrnka e ne ho parlato in questa domanda http://stackoverflow.com/questions/5346155/ef-code-first-4-1-doesnt-support-nvarcharmax-at-all) Powodzenia! =) –

+0

Questo è stato generato quando ho aggiunto una nuova proprietà al mio modello in 4.1. Prima funzionava perfettamente in 4.1. Strano. Risolto aggiungendo annotazione a tutte le proprietà nel modello. –

122

Si può provare questo in un blocco try/catch?

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

esattamente quello di cui avevo bisogno. molte grazie! –

+8

Vedere la mia risposta se non si desidera modificare alcun codice. – GONeale

1

ho trovato utile per creare un wrapper SaveChanges che rende i EntityValidationErrors più leggibile:

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 

e poi cambiato 'entities.SaveChanges()' a 'SaveChanges (entità)' in tutta la mia progetto

8

La migliore solu secondo me, è gestire questo tipo di errori in modo centralizzato.

Basta aggiungere questo metodo per il principale DbContext classe:

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

Questo sovrascriverà il metodo del vostro contesto SaveChanges() e si otterrà una virgola lista contenente tutti gli errori di validazione un'entità separata.

spero che questo sia utile.

Problemi correlati