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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:18:21