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

EF Core Scaffolding 特定类型列未生成[Required]注解问题

问题现象

在Visual Studio 2019中使用EF Core Scaffolding工具从SQL Server 2012(v11.07)反向工程生成实体类时,设置了NOT NULL约束的值类型列(包括datetime、datetime2、int)无法自动生成[Required]数据注解,仅字符串类型非空列可正常生成该注解。
复现过程如下:

  • 测试表建表语句:
create table dbo.test2 
(
    d datetime not null, 
    d2 datetime2 not null,
    i int not null, 
    txt varchar(100) not null 
)
  • 执行的Scaffold-DbContext命令:
Scaffold-DbContext "..." 
    -Provider Microsoft.EntityFrameworkCore.SqlServer 
    -ContextDir Data -OutputDir "Data/Models" 
    -DataAnnotations -UseDatabaseNames -Tables "test2"
  • 工具生成的实体类结果:
[Keyless]
[Table("test2", Schema = "dbo")]
public partial class test2
{
    [Column(TypeName = "datetime")]
    public DateTime d { get; set; }
    public DateTime d2 { get; set; }
    public int i { get; set; }
    [Required]
    [StringLength(100)]
    public string txt { get; set; }
}
  • 项目相关配置信息:
<TargetFramework>netcoreapp3.1</TargetFramework>
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.10" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.10">
产生原因

这是EF Core脚手架工具的默认设计行为,不属于功能bug:

  • int、DateTime属于.NET值类型,本身语法层面就不支持赋值为null,这类类型的属性天然自带非空约束,工具默认不会冗余添加[Required]注解。
  • string是引用类型,默认可以为null,因此只有非空的字符串列,工具才会主动添加[Required]标记其不允许为空。
    哪怕项目启用了C# 8.0+的可空引用类型特性,非空值类型列依旧不会自动生成[Required],这是EF Core各版本一直保留的默认规则。
调整方法

EF Core没有提供内置配置开关直接开启值类型列的[Required]自动生成,要实现这个需求需要通过自定义T4生成模板实现,操作步骤:

  1. 在项目中新建一个存放自定义模板的目录,例如命名为EFCoreTemplates
  2. 打开包管理器控制台,执行命令导出官方默认的生成模板:
    Scaffold-DbContext -TemplateDirectory "EFCoreTemplates"
    
    命令执行完成后,目录下会生成脚手架用到的所有T4模板文件。
  3. 打开其中的EntityType.tt文件,找到属性生成的代码段,增加判断逻辑:当属性映射的数据库列为非空、且对应CLR类型是值类型时,在属性定义上方输出[Required]特性代码。
  4. 后续每次执行Scaffold-DbContext命令时,都加上-TemplateDirectory "EFCoreTemplates"参数,生成的实体类就会自动给非空值类型列加上[Required]注解。

补充说明:如果只是做常规的模型入参校验,非空值类型本身的不可为null特性已经能满足大部分验证场景,没必要强制添加[Required];只有当业务逻辑专门依赖[Required]特性做处理(比如全局接口校验、接口文档自动生成等),才需要做这个自定义修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:30:43