数据验证
[Required] [MinLength(3,ErrorMessage = "名称长度至少为3")] [Display(Name = "名称")] public string Name { get; set; }
[Required] 表示必需的,
[MinLength(3,ErrorMessage = “名称长度至少为3”)],这里表示名称长度至少为3个字符
[Display(Name = “名称”)]这里将name显示为名称
[Range(16,100,ErrorMessage = “年龄范围为16-100”)]范围验证
ErrorMsg是校验失败时显示的提示信息。
EFCore里的数据校验特性主要来源于System.ComponentModel.DataAnnotations命名空间
CustomValidationAttribute可以采用用户自己定义的验证方法来进行验证。
但是一般都是通过继承 ValidationAttribute来进行自定义验证特性。
如下:
public class Student { public int Id { get; set; } [Required] [MinLength(3,ErrorMessage = "名称长度至少为3")] [Display(Name = "名称")] public string Name { get; set; } [CheckSex] public string Sex { get; set; } [Range(16,100,ErrorMessage = "年龄范围为16-100")] public int Age { get; set; } public ICollection<Course> Courses { get; set; } } [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class CheckSexAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { bool result= value.ToString() == "男" || value.ToString() == "女"; return result ? ValidationResult.Success : new ValidationResult("性别必须为男或者女"); } }
除此之外还可以通过 RegularExpressionAttribute,自己来定义一些相关的验证规则,继续以上面的性别为例,进行相关的验证。
修改student如下:
public class Student { public int Id { get; set; } [Required] [MinLength(3,ErrorMessage = "名称长度至少为3")] [Display(Name = "名称")] public string Name { get; set; } [RegularExpression("[0-1]",ErrorMessage = "性别只能为数字0(男)或者1(女)")] public string Sex { get; set; } [Range(16,100,ErrorMessage = "年龄范围为16-100")] public int Age { get; set; } public ICollection<Course> Courses { get; set; } }
常用验证如下:
RequiredAttribute:用于验证必需数据字段。
RangeAttribute:用于验证数值字段的值是否在指定的范围之内
StringLengthAttribute:用于验证目标字段的字符串长度是否在指定的范围之内。
MaxLengthAttribute/MinLengthAttribute:用于验证字符/数组字典的长度是否小于/大于指定的上/下限。
CreditCardAttribute 用于验证数据字段值是信用卡号。
EmailAddressAttribute 用于验证电子邮件
PhoneAttribute 用于验证是否为电话格式
UrlAttribute 用于验证是否为Url
KeyAttribute 验证是否唯一
DisplayAttribute 指定显示的字符串
CompareAttribute 提供用于比较两个属性的特性。
特别说明:
在构建实体类的时候,如果不特别指明Key值,这个时候,EFCore会默认将
Id,类名+Id的的属性作为数据表的主键。
3、数据库架构和实体类不一致的冲突
3.1 实体属性不需要存入数据库
给学生类添加一个新的属性 nickname (外号) ,但是这个属性不需要存入数据库,那么只需在nickname上加个NotMapped特性 就不会跟数据表相对应了。