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
相关产品推荐
相关产品推荐

