ASP.NET Core插入数据时idCreatedTime设getdate()默认值仍报空值错误
问题原因
抛出非空插入异常的核心逻辑:
- 你虽然给SQL Server的
idCreatedTime字段配置了getdate()默认值,但EF Core默认会把实体映射的所有字段都显式写入INSERT语句,不会留空让数据库触发默认值规则 - 你在实体类里给
IdCreatedTime写的初始值DateTime.UtcNow不会生效:因为IdCreatedTime是可空值类型DateTime?,表单提交后模型绑定流程会给未提交的字段赋值为null,直接覆盖你写的初始值 - 最终EF Core生成的INSERT语句会给
idCreatedTime显式传入NULL,触发字段非空约束,抛出异常
可用解决方案
三选一即可,优先推荐和你现有数据库默认值逻辑匹配的方案1:
方案1:标记字段为数据库生成值
给IdCreatedTime属性添加数据注解,告诉EF Core该字段由数据库侧生成值,插入、更新操作时不要主动传递字段值,直接触发数据库配置的getdate()默认值:// 引入命名空间 using Microsoft.EntityFrameworkCore; [Column("idCreatedTime", TypeName = "datetime")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime IdCreatedTime { get; set; }这里可以把属性类型从可空
DateTime?改为非空DateTime,因为数据库侧保证该字段永远不会返回NULL,EF Core在数据插入完成后会自动回填数据库生成的时间值到实体。方案2:保存前手动赋值
如果不想依赖数据库默认值,直接在提交保存逻辑里手动给自动赋值字段赋值,绕开模型绑定对初始值的覆盖:public async Task<IActionResult> OnPost() { if (ModelState.IsValid) { UserData.IdCreatedTime = DateTime.Now; await _context.UserData.AddAsync(UserData); await _context.SaveChangesAsync(); return RedirectToPage("Index"); } return Page(); }方案3:Fluent API配置默认值
在DbContext的OnModelCreating方法中统一配置字段的默认值SQL,EF Core在插入数据时如果检测到该字段没有被赋值,会自动调用你配置的SQL生成值:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<UserData>() .Property(u => u.IdCreatedTime) .HasDefaultValueSql("getdate()"); }
避坑提示:不要只给实体属性写C#侧的初始值,只要属性是可空类型、且表单没有提交对应字段,模型绑定流程就会把属性重置为null,初始值不会参与INSERT逻辑。
内容的提问来源于stack exchange,提问作者Janki Dave
相关产品推荐
相关产品推荐

