直接上代码
[Table("single_table")] public class SingleTable { [Key] public Int32 id { get; set; } //refer http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations(v=vs.110).aspx [Required] [Url] [EmailAddress] [RegularExpression("pattern")] [MaxLength(1, ErrorMessage = "cant more than 1")] [MinLength(1)] [Range(1, 5)] [FileExtensions] [DataType(DataType.CreditCard)] //还不熟 [myValidation(ErrorMessage = "xx")] //ErrorMessage是attribute对象公开属性 public string data { get; set; } }
这些都是default微软提供的基本验证
在 SaveChanges()的时候会触发
也可以在通过entry验证
bool ok = db.Entry(data).GetValidationResult().IsValid;
string errorMsg = db.Entry(data).GetValidationResult().ValidationErrors.First().ErrorMessage;
ValidationErrors 是个集合,可能有多个错误。
上面有一个 myValidation 是我们自定义的,来看代码吧
public class myValidation : ValidationAttribute { public myValidation() { //init } //Override ValidationResult //object value 是当前的值,可以判断类型来进行不同验证. //ValidationContext 里面可以获取当前被验证的entity对象,通过反射应该要拿什么都可以了吧. protected override ValidationResult IsValid(object value, ValidationContext validationContext) { this.ErrorMessage = "5566"; //这里可以动态拼写errorMsg //成功 return ValidationResult.Success; //失败就返回error msg return new ValidationResult(this.ErrorMessageString); } }
看完注释就应该明白了吧.
还有就是如何捕获异常
catch (DbEntityValidationException ex) //用这个class { //因为 SaveChanges 会同时验证多个实体 //所以这里可能会有很多哦 foreach (var eve in ex.EntityValidationErrors) { //eve可以用entry获取实体 string className = eve.Entry.Entity.GetType().Name; //eve内有实体 string state = eve.Entry.State.ToString(); //state added,modified 等 foreach (var ve in eve.ValidationErrors) { //每个属性和errorMsg string attr = ve.PropertyName; string errorMsg = ve.ErrorMessage; } } throw null; }