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

Postgres+EF Core7中DatabaseGeneratedOption.Identity字段偶现infinity值问题

Postgres + EF Core 7中DateCreated更新时被设为infinity的问题分析

环境:Postgres + EF Core 7,所有实体继承自以下抽象类:

public abstract class Auditable
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime DateCreated { get; private set; }

    public DateTime DateUpdated { get; set; }
}

public class User : Auditable //...

_dbContext.Users.Update(user);
await _dbContext.SaveChangesAsync();

问题:插入时DateCreated能生成正确值,但偶尔更新时会被替换为infinity,且该字段setter为私有,无法通过修改实体直接更改。

可能的原因:

  • EF Core实体跟踪异常:如果user是脱离上下文跟踪的实例(比如反序列化得到的对象),调用Update会将其标记为Modified状态,EF Core会尝试发送所有字段的当前值到数据库。若内存中DateCreated被意外设为DateTime.MaxValue(比如反序列化错误),Postgres会将该值映射为infinity,从而导致更新后字段值异常。
  • Postgres端配置冲突:虽然EF Core标记了DatabaseGeneratedOption.Identity,但如果Postgres的DateCreated列设置了更新时的默认值,或者存在错误的触发器(比如UPDATE操作中强制修改DateCreated为infinity),就会在更新时覆盖原有值。
  • EF Core模型配置错误:若模型构建时没有正确应用DatabaseGeneratedOption.Identity特性,或者存在自定义配置覆盖了该设置,EF Core可能在更新时错误地尝试发送DateCreated字段的值,导致异常值被写入。
  • DbContext复用或并发问题:如果同一个DbContext实例被复用处理多个请求,可能出现实体状态混乱,比如之前操作中某个实体的DateCreated被设为异常值,上下文跟踪状态未清理,后续更新时误将该值带入。
  • DateTime序列化/反序列化错误:如果user实体来自JSON反序列化(比如API请求),部分序列化器会将无效DateTime值转换为DateTime.MaxValue,Postgres会把这个值解析为infinity,调用Update时就会将该错误值写入数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:01:16