EF Core Code First正则校验注解迁移至SQL Server的实现方案咨询
问题原因
RegularExpression 特性属于.NET 应用层校验能力,仅会在 EF Core 执行 SaveChanges 前在程序运行时做校验,不会自动转换为数据库层面的约束规则,因此生成迁移时不会同步到 SQL Server 结构中。
正确实现方案
方案1:通过EF Core配置检查约束(推荐)
你提到的 HasCheckConstraint 思路是可行的,只需要修正约束规则的逻辑即可,SQL Server 中可以通过 PATINDEX 函数判断字段是否包含非法字符,写法如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Vendor>(entity => { entity.HasCheckConstraint("CK_Vendor_No_ValidRule", "PATINDEX('%[^A-Z0-9\-_]%', No) = 0 AND LEN(No) BETWEEN 1 AND 20"); }); base.OnModelCreating(modelBuilder); }
规则说明:
[^A-Z0-9\-_]代表所有不在允许范围内的字符PATINDEX('%[^A-Z0-9\-_]%', No) = 0代表字段中不存在非法字符- 如果需要支持小写字母,可将规则中的
A-Z修改为A-Za-z;如果数据库排序规则为大小写不敏感,仅写A-Z即可同时匹配大小写 - 你已经在字段上加了
[MaxLength(20)]注解,数据库字段长度会自动限制为20,LEN(No) BETWEEN 1 AND 20可以作为双重保险保留,也可以删除
如果使用 SQL Server 2017 及以上版本,还可以用原生的正则匹配函数REGEXP_LIKE,和你C#中写的正则逻辑完全一致:
entity.HasCheckConstraint("CK_Vendor_No_ValidRule", "REGEXP_LIKE(No, '^[A-Z0-9\-_]{1,20}$')");
其他可选实现方式
- 应用层校验兜底:保留现有的
RegularExpression注解,在请求进入数据库前就提前拦截非法输入,返回自定义错误提示,和数据库约束同时使用形成两层校验,体验更好。 - 触发器实现:如果有更复杂的联动校验逻辑,可以编写INSERT/UPDATE触发器判断字段合法性,性能和维护成本比检查约束高,非必要不推荐。
原有思路的问题
你之前写的([Display Name] NOT LIKE '%[A-Z0-9\-\_]%')逻辑完全相反,该规则代表字段不包含任何允许的字符,和需求不符,因此不能直接使用。
内容的提问来源于stack exchange,提问作者PaataPP
相关产品推荐
相关产品推荐

