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

如何在数据库层面强制执行验证规则?

如何通过Entity Framework Core让数据库强制执行验证规则?

我已经在模型层、服务层和UI层设置了验证逻辑,示例代码如下:

public int Id { get; set; }

[Required]
public string FirstName { get; set; }

[Required]
public string LastName { get; set; }

[Required]
[RegularExpression(RegularExpressions.UK_PHONE_REGEX)]
public string PhoneNumber { get; set; }

public string Notes { get; set; }

现在遇到一个问题:即使数据不符合代码中设置的验证规则,我仍可通过SSMS手动将其输入数据库。比如能输入像'8'或'10000'这样的手机号,而根据正则表达式这些本应被禁止(我在测试正则时它能正确拒绝这些值)。我使用Entity Framework Core进行数据库连接,已经执行了Add-Migration和Update-Database操作,请问有没有办法在数据库本身强制执行验证规则来解决这个问题?


解决方案

EF Core默认不会把[RegularExpression]这类数据注解直接转换成数据库层面的约束,所以手动修改数据库时会绕过应用层验证。要在数据库层面强制执行规则,有几种可行方式:

1. 用EF Core Fluent API添加数据库检查约束

在DbContext的OnModelCreating方法中,针对PhoneNumber字段添加数据库级的正则检查约束。示例代码如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 注意:需将.NET正则转换为数据库兼容的语法(比如SQL Server用LIKE/PATINDEX)
    modelBuilder.Entity<你的实体类名>()
        .Property(e => e.PhoneNumber)
        .HasCheckConstraint("CK_实体类名_PhoneNumber", 
            $"PhoneNumber LIKE '{转换后的SQL兼容正则}'");
}

不同数据库的正则语法和.NET存在差异,比如SQL Server不支持.NET风格的部分正则语法,需要你把UK_PHONE_REGEX调整为对应数据库能识别的模式。

2. 手动在数据库中添加检查约束

如果不想通过EF Core迁移,直接在SSMS中执行SQL语句添加约束:

ALTER TABLE 你的表名
ADD CONSTRAINT CK_表名_PhoneNumber
CHECK (PhoneNumber LIKE '你的SQL兼容版英国手机号正则');

3. 数据库触发器(备选方案)

可以创建INSERT/UPDATE触发器,在数据变更时验证手机号格式,不符合则抛出错误。但触发器会增加数据库维护成本,优先推荐检查约束方案。

后续操作

如果用EF Core的方式添加约束,需要重新生成并应用迁移:

Add-Migration AddPhoneNumberCheckConstraint
Update-Database

同时要确保数据库约束和应用层验证规则保持一致,避免出现规则不匹配的情况。

内容的提问来源于stack exchange,提问作者jacky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:45:06