.NET 8 EF Core DbContext.Add未插入非键列报空值错误,求排查
问题排查与解决方案
核心问题
你的DbPageCompleted实体类中,lastUpdateTime是字段而非属性,缺少get; set;访问器:
[Column("last_update_time")] [Required] public DateTime? lastUpdateTime; // 这是字段,不是属性
EF Core默认只会映射带有get和set访问器的属性,无法识别普通字段。因此即使你给字段赋值,EF Core也不会将这个值包含在生成的INSERT语句中,数据库收到的该列值为NULL,触发非空约束报错。
修复步骤
将lastUpdateTime修改为属性,添加get; set;访问器:
[Column("last_update_time")] [Required] public DateTime? lastUpdateTime { get; set; }
额外优化建议
- 避免静态DbContext实例:你在
ExptContext中定义了静态的dbContext字段,测试场景下容易导致上下文状态混乱(比如重复插入、状态残留)。建议在测试方法中创建新的上下文实例并使用using确保资源释放:[Test] public void Expt() { using var dbContext = new ExptContext(); dbContext.pageCompletions.Add(dbPageCompleted); dbContext.SaveChanges(); } - 统一数据注解与类型:
[Required]注解标记字段非空,但结合可空的DateTime?类型存在矛盾。如果数据库列确实不允许NULL,建议将类型改为非空的DateTime:[Column("last_update_time")] [Required] public DateTime lastUpdateTime { get; set; }
内容的提问来源于stack exchange,提问作者user3478180
相关产品推荐
相关产品推荐

