Entity Framework - Convalida
In questo capitolo apprendiamo le tecniche di convalida che possono essere utilizzate in ADO.NET Entity Framework per convalidare i dati del modello. Entity Framework fornisce una grande varietà di funzionalità di convalida che possono essere implementate in un'interfaccia utente per la convalida lato client o possono essere utilizzate per la convalida lato server.
In Entity Framework, la convalida dei dati fa parte della soluzione per la cattura di dati non validi in un'applicazione.
Entity Framework convalida tutti i dati prima che vengano scritti nel database per impostazione predefinita, utilizzando un'ampia gamma di metodi di convalida dei dati.
Tuttavia, Entity Framework viene fornito dopo la convalida dei dati dell'interfaccia utente. Quindi, in quel caso, è necessaria la convalida dell'entità per gestire le eccezioni generate da EF e mostrare un messaggio generico.
Esistono alcune tecniche di convalida dei dati per migliorare il controllo degli errori e come ritrasmettere i messaggi di errore all'utente.
DbContext dispone di un metodo Overridable denominato ValidateEntity. Quando chiami SaveChanges, Entity Framework chiamerà questo metodo per ogni entità nella sua cache il cui stato non è Unchanged. È possibile inserire la logica di convalida direttamente qui come mostrato nell'esempio seguente per l'entità studente.
public partial class UniContextEntities : DbContext {
protected override System.Data.Entity.Validation
.DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry,
System.Collections.Generic.IDictionary<object, object> items) {
if (entityEntry.Entity is Student) {
if (entityEntry.CurrentValues.GetValue<string>("FirstMidName") == "") {
var list = new List<System.Data.Entity
.Validation.DbValidationError>();
list.Add(new System.Data.Entity.Validation
.DbValidationError("FirstMidName", "FirstMidName is required"));
return new System.Data.Entity.Validation
.DbEntityValidationResult(entityEntry, list);
}
}
if (entityEntry.CurrentValues.GetValue<string>("LastName") == "") {
var list = new List<System.Data.Entity
.Validation.DbValidationError>();
list.Add(new System.Data.Entity.Validation
.DbValidationError("LastName", "LastName is required"));
return new System.Data.Entity.Validation
.DbEntityValidationResult(entityEntry, list);
}
return base.ValidateEntity(entityEntry, items);
}
}
Nel metodo ValidateEntity sopra, le proprietà FirstMidName e LastName dell'entità Student vengono controllate se una qualsiasi di queste proprietà ha una stringa vuota, quindi restituirà un messaggio di errore.
Diamo un'occhiata a un semplice esempio in cui viene creato un nuovo studente, ma il FirstMidName dello studente è una stringa vuota come mostrato nel codice seguente.
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
Console.WriteLine("Adding new Student to the database");
Console.WriteLine();
try {
context.Students.Add(new Student() {
FirstMidName = "",
LastName = "Upston"
});
context.SaveChanges();
} catch (DbEntityValidationException dbValidationEx) {
foreach (DbEntityValidationResult entityErr in
dbValidationEx.EntityValidationErrors) {
foreach (DbValidationError error in entityErr.ValidationErrors) {
Console.WriteLine("Error: {0}",error.ErrorMessage);
}
}
}
Console.ReadKey();
}
}
}
Quando l'esempio precedente viene compilato ed eseguito, verrà visualizzato il seguente messaggio di errore nella finestra della console.
Adding new Student to the database
Error: FirstMidName is required
Ti consigliamo di eseguire l'esempio precedente in modo graduale per una migliore comprensione.