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生成模板实现,操作步骤:
- 在项目中新建一个存放自定义模板的目录,例如命名为
EFCoreTemplates - 打开包管理器控制台,执行命令导出官方默认的生成模板:
命令执行完成后,目录下会生成脚手架用到的所有T4模板文件。Scaffold-DbContext -TemplateDirectory "EFCoreTemplates" - 打开其中的
EntityType.tt文件,找到属性生成的代码段,增加判断逻辑:当属性映射的数据库列为非空、且对应CLR类型是值类型时,在属性定义上方输出[Required]特性代码。 - 后续每次执行Scaffold-DbContext命令时,都加上
-TemplateDirectory "EFCoreTemplates"参数,生成的实体类就会自动给非空值类型列加上[Required]注解。
补充说明:如果只是做常规的模型入参校验,非空值类型本身的不可为null特性已经能满足大部分验证场景,没必要强制添加
[Required];只有当业务逻辑专门依赖[Required]特性做处理(比如全局接口校验、接口文档自动生成等),才需要做这个自定义修改。
内容的提问来源于stack exchange,提问作者Jeb50
相关产品推荐
相关产品推荐

