全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

EF Core如何进行数据验证 EF Core Validation数据验证方法

最常用的是Data Annotations基础验证,如[Required]、[StringLength]等,仅应用层生效;跨字段验证需实现IValidatableObject;复杂业务推荐FluentValidation;数据库约束需手动添加以作双重保障。

用数据注解做基础验证

这是最常用也最轻量的方式,直接在实体类属性上加特性,EF Core会在 SaveChanges() 时自动触发验证。不需要额外配置,只要引用 System.ComponentModel.DataAnnotations 命名空间即可。

常见注解包括:

  • [Required]:字段不能为空(会生成 NOT NULL 约束)
  • [StringLength(50)]:限制字符串最大长度
  • [Range(18, 120)]:数值范围检查
  • [EmailAddress][Url]:格式校验(仅验证格式,不发请求)
  • [RegularExpression(@"^\d{3}-\d{2}-\d{4}$")]:自定义正则匹配

注意:这些注解只在应用层生效,不会自动同步到数据库约束,如需双重保障,得配合迁移脚本手动添加 CHECK 或 UNIQUE 约束。

实现 IValidatableObject 做跨字段验证

当单个字段的规则不够用,比如“结束时间不能早于开始时间”,就得靠接口级验证。让实体类实现 IValidatableObject,重写 Validate 方法:

public class Order : IValidatableObject
{
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; }

    public IEnumerable Validate(ValidationContext validationContext)
    {
        if (EndDate.HasValue && EndDate.Value < StartDate)
            yield return new ValidationResult("结束时间不能早于开始时间", new[] { nameof(EndDate) });
    }
}

这个方法会在 SaveChanges 前被调用,支持返回多个错误,也能精准指定出错字段。

手动触发验证获取详细错误

有时你不想等到 SaveChanges 才知道错在哪,比如前端提交前想预检。可以用 .NET 自带的 Validator 类主动验证对象:

var context = new AppDbContext();
var user = new User { Name = "TooLongNameForFive" };
var validationContext = new ValidationContext(user);
var results = new List();
bool isValid = Validator.TryValidateObject(user, validationContext, results, true);

if (!isValid)
{
    foreach (var error in results)
    {
        Console.WriteLine(error.ErrorMessage);
    }
}

参数 true 表示验证所有属性(含私有和嵌套对象),适合调试或 API 入口校验。

结合 FluentValidation 做更灵活的业务验证

如果项目中验证逻辑复杂、需要依赖服务(如查数据库判断用户名是否已存在),内置方式就力不从心了。这时推荐引入 FluentValidation

  • 单独定义验证器类,与实体解耦
  • 支持异步验证、条件验证、本地化错误消息
  • 可无缝集成 ASP.NET Core 的模型绑定和中间件

例如:

public class UserValidator : AbstractValidator
{
    public UserValidator()
    {
        RuleFor(x => x.Email).NotEmpty().EmailAddress();
        RuleFor(x => x.Name).MustAsync(async (user, name, ct) =>
            !await IsNameTaken(name)).WithMessage("用户名已被占用");
    }
}

注册后,EF Core 不会自动调用它,但你可以包装 SaveChanges 或在仓储层统一拦截处理。

基本上就这些。核心是分清场景:简单字段规则用 Data Annotations;跨字段逻辑用 IValidatableObject;复杂业务或需服务参与时选 FluentValidation。数据库约束作为最后一道防线,建议手动补全。


# 前端  # app  # ai  # 本地化  # .net  # red  # 中间件  # NULL  # 命名空间  # 字符串  # 接口  # 对象  # 异步  # 数据库  # 会在  # 最常用  # 的是  # 早于  # 这是  # 应用层  # 结束时间  # 多个  # 不需要  # 也能 


相关文章: c# 在高并发场景下,委托和接口调用的性能对比  如何获取开源自助建站系统免费下载链接?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  股票网站制作软件,网上股票怎么开户?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  制作网站的软件免费下载,免费制作app哪个平台好?  如何在腾讯云服务器快速搭建个人网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  ,网页ppt怎么弄成自己的ppt?  C#怎么创建控制台应用 C# Console App项目创建方法  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何用虚拟主机快速搭建网站?详细步骤解析  网站制作费用多少钱,一个网站的运营,需要哪些费用?  建站之星2.7模板快速切换与批量管理功能操作指南  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  小程序网站制作需要准备什么资料,如何制作小程序?  如何在万网开始建站?分步指南解析  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  javascript中对象的定义、使用以及对象和原型链操作小结  如何在Windows服务器上快速搭建网站?  如何将凡科建站内容保存为本地文件?  广州美橙建站如何快速搭建多端合一网站?  如何快速搭建二级域名独立网站?  ui设计制作网站有哪些,手机UI设计网址吗?  制作营销网站公司,淘特是干什么用的?  Swift中switch语句区间和元组模式匹配  音响网站制作视频教程,隆霸音响官方网站?  建站之星后台管理系统如何操作?  如何在橙子建站上传落地页?操作指南详解  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何在阿里云部署织梦网站?  音乐网站服务器如何优化API响应速度?  建站主机选哪家性价比最高?  长沙做网站要多少钱,长沙国安网络怎么样?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  中山网站制作网页,中山新生登记系统登记流程?  魔方云NAT建站如何实现端口转发?  如何在香港免费服务器上快速搭建网站?  建站之星安装路径如何正确选择及配置?  如何基于云服务器快速搭建网站及云盘系统?  专业网站建设制作报价,网页设计制作要考什么证?  如何解决VPS建站LNMP环境配置常见问题?  如何通过虚拟主机快速搭建个人网站?  如何注册花生壳免费域名并搭建个人网站?  宁波免费建站如何选择可靠模板与平台?  济南专业网站制作公司,济南信息工程学校怎么样?  如何用AWS免费套餐快速搭建高效网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。