2014-10-10 14 views
5

Ciao Sto usando Entity Framework 6.1.1 che supporta la funzione di annotazione dei dati dell'indice in esso. Ho un campo definito nella mia classe entità come:Messaggio di errore per l'annotazione dei dati dell'indice in EF

[Index("scoreIndex", IsUnique=true)] 
    public int score{ get; set; } 

Questo sta lavorando bene. Tuttavia, sto cercando di capire come visualizzare un messaggio quando il punteggio non è unico. In questo momento lancia solo un'eccezione. Ho provato il seguente

[Index("scoreIndex", IsUnique=true, ErrorMessage="Score must be unique")] 

Ma non contiene la definizione per ErrorMessage per questa classe di annotazione dell'indice. Puoi dirmi come gestire il messaggio di eccezione in modo che lo gestisca con garbo?

+0

L'attributo di indice indica semplicemente a EF di creare un indice durante l'esecuzione della migrazione, ma non fa in modo che EF imponga l'indice. Dovrai gestire l'eccezione nel tuo codice. In alternativa, puoi scrivere un'annotazione dati personalizzata che in realtà convalida la proprietà per l'unicità. –

risposta

2

IndexAttribute non è un attributo di convalida ed è per questo che non ha la proprietà ErrorMessage e non ha il metodo IsValid() utilizzato per convalidarlo su un intervallo di valori validi.

Ciò significa che non è progettato per essere convalidato come i tipici attributi di convalida (Obbligatorio, MaxLength ecc.). L'attributo IsUnique viene utilizzato solo durante la creazione della tabella per creare un indice univoco.

Se si desidera utilizzare gli attributi, è necessario creare un attributo personalizzato per verificare l'univocità dell'indice. Ovviamente quell'indice erediterà la classe ValidationAttribute e dovrà accedere a EF DbContext internamente per verificare l'unicità nel codice di convalida dell'attributo.

Se non ti piace questo approccio di annotazione dei dati ed è troppo complesso, puoi gestire lo DbUpdateException generato dal metodo SaveChanges() in un blocco try-catch, decodificare il messaggio di errore e restituire qualcosa di amichevole in il tuo modello di vista.

try 
{ 
    using (var ac = new ApplicationDbContext()) 
    { 
     // Add non-unique data 

     ac.SaveChanges(); 
    } 
} 
catch (DbUpdateException ex) 
{ 
    // Handle index error 
} 
Problemi correlati