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

如何用EF Core7和NPGSQL自动设置Created与Modified列

解决PostgreSQL + EF Core中Modified字段自动更新的问题

问题原因

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]仅告知EF该字段值由数据库生成,但PostgreSQL不会自动为你创建更新Modified字段的逻辑——必须手动配置数据库触发器,或通过EF Core的Fluent API统一添加相关规则。

解决方案(无需手动修改迁移,统一配置所有表)

在你的DbContext的OnModelCreating方法中,添加以下统一配置逻辑,自动为所有继承BaseEntity的实体配置Created和Modified字段,并生成数据库触发器保证Modified在更新时自动赋值:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 遍历所有继承BaseEntity的实体类型
    foreach (var entityType in modelBuilder.Model.GetEntityTypes()
        .Where(t => typeof(BaseEntity).IsAssignableFrom(t.ClrType)))
    {
        // 配置Created字段:数据库层面添加UTC时间默认值,和代码端的UtcNow形成双重保障
        modelBuilder.Entity(entityType.ClrType)
            .Property(nameof(BaseEntity.Created))
            .HasDefaultValueSql("NOW() AT TIME ZONE 'utc'");

        // 标记Modified字段为数据库生成
        modelBuilder.Entity(entityType.ClrType)
            .Property(nameof(BaseEntity.Modified))
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

        // 生成触发器:更新时自动设置Modified为当前UTC时间
        var tableName = entityType.GetTableName();
        var triggerFuncName = $"trg_{tableName}_update_modified_func";
        var triggerName = $"trg_{tableName}_update_modified";

        modelBuilder.Entity(entityType.ClrType)
            .HasTriggerSql($@"
CREATE OR REPLACE FUNCTION {triggerFuncName}()
RETURNS TRIGGER AS $$
BEGIN
    NEW.""Modified"" = NOW() AT TIME ZONE 'utc';
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER {triggerName}
BEFORE UPDATE ON ""{tableName}""
FOR EACH ROW EXECUTE FUNCTION {triggerFuncName}();");
    }

    // 其他实体配置逻辑...
}

补充说明

  1. Created字段的双重保障:代码端初始化DateTime.UtcNow,数据库层面添加默认值,避免特殊场景下EF未赋值导致数据库字段为空。
  2. 触发器的作用:每次更新表中记录时,触发器会自动将Modified字段设置为当前UTC时间,无需手动在业务代码中赋值。
  3. 自动生成迁移:执行Add-Migration时,EF会自动将这些触发器逻辑写入迁移文件,无需手动修改迁移内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:55:26