Entity Framework - Walidacja
W tym rozdziale dowiemy się o technikach walidacji, których można użyć w ADO.NET Entity Framework do walidacji danych modelu. Entity Framework zapewnia szeroką gamę funkcji walidacji, które można zaimplementować w interfejsie użytkownika w celu walidacji po stronie klienta lub użyć do walidacji po stronie serwera.
W Entity Framework sprawdzanie poprawności danych jest częścią rozwiązania służącego do przechwytywania złych danych w aplikacji.
Entity Framework domyślnie sprawdza wszystkie dane, zanim zostaną one zapisane w bazie danych, przy użyciu szerokiego zakresu metod sprawdzania poprawności danych.
Jednak Entity Framework pojawia się po sprawdzeniu poprawności danych interfejsu użytkownika. W takim przypadku istnieje potrzeba walidacji jednostki, aby obsłużyć wszelkie wyjątki, które EF zgłasza i pokazać ogólny komunikat.
Istnieją pewne techniki sprawdzania poprawności danych, które usprawniają sprawdzanie błędów i przekazywanie komunikatów o błędach z powrotem do użytkownika.
DbContext ma metodę Overridable o nazwie ValidateEntity. Po wywołaniu SaveChanges Entity Framework wywoła tę metodę dla każdej jednostki w jej pamięci podręcznej, której stan nie jest niezmieniony. Możesz umieścić logikę walidacji bezpośrednio tutaj, jak pokazano w poniższym przykładzie dla jednostki ucznia.
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);
}
}
W powyższej metodzie ValidateEntity właściwości jednostki ucznia FirstMidName i LastName są sprawdzane, jeśli którakolwiek z tych właściwości ma pusty ciąg, a następnie zwróci komunikat o błędzie.
Rzućmy okiem na prosty przykład, w którym tworzony jest nowy uczeń, ale jego FirstMidName jest pustym ciągiem, jak pokazano w poniższym kodzie.
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();
}
}
}
Gdy powyższy przykład zostanie skompilowany i wykonany, w oknie konsoli pojawi się następujący komunikat o błędzie.
Adding new Student to the database
Error: FirstMidName is required
Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.