You can write custom server side validation for any entity. To accomplish this, override the ValidateEntity
method of DbContext
as shown below.
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>("StudentName") == "") { var list = new List<System.Data.Entity.Validation.DbValidationError>(); list.Add(new System.Data.Entity.Validation.DbValidationError("StudentName", "StudentName is required")); return new System.Data.Entity.Validation.DbEntityValidationResult(entityEntry, list); } } return base.ValidateEntity(entityEntry, items); }
As you can see in the above code, we are validating the Student entity. If StudentName is blank, then we are adding DBValidationError into DBEntityValidationResult.
So, whenever you call the DbContext.SaveChanges
method and try to save the Student
entity without the StudentName
, then it will throw a DbEntityValidationException
. Consider the following example.
try { using (var ctx = new SchoolDBEntities()) { ctx.Students.Add(new Student() { StudentName = "" }); ctx.Standards.Add(new Standard() { StandardName = "" }); ctx.SaveChanges(); } } catch (DbEntityValidationException dbEx) { foreach (DbEntityValidationResult entityErr in dbEx.EntityValidationErrors) { foreach (DbValidationError error in entityErr.ValidationErrors) { Console.WriteLine("Error Property Name {0} : Error Message: {1}", error.PropertyName, error.ErrorMessage); } } }