在Entity Framework中验证实体
您可以为任何实体编写自定义服务器端验证。要做到这一点,重写DbContext的ValidateEntity方法,如下所示。
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);
}
正如您在上面的代码中看到的,我们正在验证Student实体。如果StudentName为空,那么我们将DBValidationError添加到DBEntityValidationResult中。无论何时你调用DbContext.SaveChanges方法并尝试保存没有StudentName的Student实体,然后它将抛出一个DbEntityValidationException。考虑下面的例子。
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);
}
}
}
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/