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

Entity Framework如何设置列默认值为GetUtcDate()并实现创建后只读?

Entity Framework中Created列的默认值与只读配置

1. 让SQL Server自动填充Created列默认值

完全可以实现和你之前ADO.NET一样的效果,分两种场景处理:

  • 数据库优先模式:如果你是基于已有的SSMS创建的数据库(带Created列和GetUtcDate()默认值),EF在生成实体模型时会自动识别这个默认值配置。插入实体时,只要不手动给Created属性赋值,SQL Server就会自动用当前UTC时间填充该列。
  • 代码优先模式:可以通过Fluent API显式配置默认值,示例代码如下:
    modelBuilder.Entity<YourEntity>()
        .Property(e => e.Created)
        .HasDefaultValueSql("GETUTCDATE()");
    
    这样生成数据库时,Created列会自动带上GETUTCDATE()的默认值约束,插入操作时不赋值就会触发默认值逻辑。

2. 实现Created列创建后只读

可以从EF配置和实体类定义两个层面实现:

  • EF层面禁止更新:使用ValueGeneratedOnAdd()配置,告诉EF该列的值仅在插入时生成,后续更新操作会忽略这个列,不会将其包含在UPDATE语句中,相当于数据库层面的只读:
    modelBuilder.Entity<YourEntity>()
        .Property(e => e.Created)
        .IsRequired()
        .HasDefaultValueSql("GETUTCDATE()")
        .ValueGeneratedOnAdd();
    
  • 实体类层面只读:把Created属性设为{get;}是可行的,EF完全可以正常读取数据库中的值。但要注意代码优先模式下,需要加上数据库生成的配置,比如用DataAnnotation:
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime Created { get; }
    
    或者用Fluent API的ValueGeneratedOnAdd(),否则EF可能会认为这个属性需要手动赋值,导致插入时报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:05:03