Entity Framework如何设置列默认值为GetUtcDate()并实现创建后只读?
Entity Framework中Created列的默认值与只读配置
1. 让SQL Server自动填充Created列默认值
完全可以实现和你之前ADO.NET一样的效果,分两种场景处理:
- 数据库优先模式:如果你是基于已有的SSMS创建的数据库(带Created列和
GetUtcDate()默认值),EF在生成实体模型时会自动识别这个默认值配置。插入实体时,只要不手动给Created属性赋值,SQL Server就会自动用当前UTC时间填充该列。 - 代码优先模式:可以通过Fluent API显式配置默认值,示例代码如下:
这样生成数据库时,Created列会自动带上modelBuilder.Entity<YourEntity>() .Property(e => e.Created) .HasDefaultValueSql("GETUTCDATE()");GETUTCDATE()的默认值约束,插入操作时不赋值就会触发默认值逻辑。
2. 实现Created列创建后只读
可以从EF配置和实体类定义两个层面实现:
- EF层面禁止更新:使用
ValueGeneratedOnAdd()配置,告诉EF该列的值仅在插入时生成,后续更新操作会忽略这个列,不会将其包含在UPDATE语句中,相当于数据库层面的只读:modelBuilder.Entity<YourEntity>() .Property(e => e.Created) .IsRequired() .HasDefaultValueSql("GETUTCDATE()") .ValueGeneratedOnAdd(); - 实体类层面只读:把Created属性设为
{get;}是可行的,EF完全可以正常读取数据库中的值。但要注意代码优先模式下,需要加上数据库生成的配置,比如用DataAnnotation:
或者用Fluent API的[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime Created { get; }ValueGeneratedOnAdd(),否则EF可能会认为这个属性需要手动赋值,导致插入时报错。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

