You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:48:01