Khung thực thể - Xác thực
Trong chương này, chúng ta hãy tìm hiểu về các kỹ thuật xác thực có thể được sử dụng trong ADO.NET Entity Framework để xác thực dữ liệu mô hình. Entity Framework cung cấp nhiều tính năng xác thực khác nhau có thể được triển khai cho giao diện người dùng để xác thực phía máy khách hoặc có thể được sử dụng để xác thực phía máy chủ.
Trong Entity Framework, xác thực dữ liệu là một phần của giải pháp để bắt dữ liệu xấu trong ứng dụng.
Entity Framework xác thực tất cả dữ liệu trước khi nó được ghi vào cơ sở dữ liệu theo mặc định, sử dụng nhiều phương pháp xác thực dữ liệu.
Tuy nhiên, Entity Framework ra đời sau khi xác thực dữ liệu giao diện người dùng. Vì vậy, trong trường hợp đó, cần xác thực thực thể để xử lý bất kỳ trường hợp ngoại lệ nào mà EF ném ra và hiển thị một thông báo chung.
Có một số kỹ thuật xác thực dữ liệu để cải thiện việc kiểm tra lỗi của bạn và cách chuyển lại thông báo lỗi cho người dùng.
DbContext có một phương thức Overridable được gọi là ValidateEntity. Khi bạn gọi SaveChanges, Entity Framework sẽ gọi phương thức này cho từng thực thể trong bộ đệm ẩn của nó có trạng thái không phải là Unchanged. Bạn có thể đặt logic xác thực trực tiếp tại đây như được hiển thị trong ví dụ sau cho Đối tượng Sinh viên.
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);
}
}
Trong phương thức ValidateEntity ở trên, các thuộc tính FirstMidName và LastName của thực thể Student được kiểm tra nếu bất kỳ thuộc tính nào trong số này có chuỗi trống, thì nó sẽ trả về một thông báo lỗi.
Hãy xem một ví dụ đơn giản trong đó một sinh viên mới được tạo, nhưng FirstMidName của sinh viên đó là chuỗi trống như được hiển thị trong đoạn mã sau.
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();
}
}
}
Khi ví dụ trên được biên dịch và thực thi, bạn sẽ nhận được thông báo lỗi sau trên cửa sổ giao diện điều khiển.
Adding new Student to the database
Error: FirstMidName is required
Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.