EF Core Required注解怎么用 EF Core非空约束设置方法

来源:这里教程网 时间:2026-02-21 17:35:27 作者:

EF Core 中设置字段为非空(即数据库列 NOT NULL),主要有两种方式:数据注解(Data Annotations)和 Fluent API。选哪种取决于你的设计偏好——注解更直观、适合简单场景;Fluent API 更灵活、适合集中配置或规避 UI 验证干扰。

用 [Required] 注解快速设为非空

在实体属性上加

[Required]
,EF Core 会在迁移生成时自动把对应列设为 NOT NULL

public class Product
{
    public int Id { get; set; }
    [Required]          // → 数据库中 Name 列将为 NOT NULL
    public string Name { get; set; }
    [Required]
    public decimal Price { get; set; }
}

注意:如果项目启用了 C# 可空引用类型(

<nullable>enable</nullable>
),
string Name
默认会被视为可空,此时
[Required]
不仅影响数据库,也参与模型验证(比如 MVC 绑定或 API 模型验证)。若只想约束数据库而不触发前端校验,就别用这个方式。

用 Fluent API 在 OnModelCreating 中配置

DbContext.OnModelCreating
方法里统一设置,完全绕过属性级注解,不参与任何运行时验证:

对单个属性:
modelBuilder.Entity<product>().Property(p => p.Name).IsRequired();</product>
对多个属性批量处理:可以写扩展方法或循环遍历审计字段(如
CreatedBy
,
CreatedTime
对所有实体的某类属性(比如所有
Id
或所有
CreatedAt
):可用反射 +
GetEntityTypes()
动态配置

例如只让

CreatedBy
在数据库强制非空,但不暴露给 UI:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>().Property(o => o.CreatedBy).IsRequired();
    modelBuilder.Entity<User>().Property(u => u.CreatedBy).IsRequired();
}

配合默认值避免迁移失败

如果字段原本允许 NULL,现在要改成 NOT NULL,直接加

IsRequired()
并生成迁移会失败(因已有 NULL 数据)。必须分两步:

先在
Up(MigrationBuilder)
中用
migrationBuilder.Sql(...)
填充现有 NULL 行(如设为
'system'
或当前时间)
再调用
AlterColumn(... nullable: false)

这是生产环境改结构的标配操作,漏掉预处理就会报错“无法将列设为 NOT NULL,因为存在 NULL 值”。

小技巧:让非空字段自动填默认值

除了设

IsRequired()
,还可以搭配默认值,让数据库兜底:

固定默认值:
.HasDefaultValue("unknown")
数据库函数默认值:
.HasDefaultValueSql("GETDATE()")
"CURRENT_TIMESTAMP"
SQL Server 还支持命名默认约束(EF Core 10+):
.HasDefaultValue(0, "DF_Orders_Status")

这样即使应用层没赋值,插入也不会失败,还能保持列非空。

基本上就这些。注解够用就别折腾,要解耦验证和数据库约束就上 Fluent API,改老表记得补数据再锁空值。

相关推荐