EF v6.2.0写入数据库时BuildTime字段NULL插入异常求助
排查EF6.2.0 SaveChanges时BuildTime列NULL插入错误
先梳理下你的问题场景:你在用Entity Framework 6.2.0,遇到了和某Stack Overflow问题类似的报错——调用SaveChanges()时抛出SqlException,提示无法将NULL插入表的BuildTime列,但原问题的解决方案对你没用。你的赋值代码是:
buildDetail.BuildTime = epoch.AddMilliseconds(Double.Parse(buildTime)).ToLocalTime(); // 其他属性设置代码 ps.dbEntities.BuildDetails.Add(buildDetailT); ps.dbEntities.SaveChanges();
这里给你几个针对性的排查方向,都是实际开发中容易踩的坑:
先检查对象实例是否匹配:你给
buildDetail.BuildTime赋了值,但添加到上下文的是buildDetailT——这两个变量是不是同一个实例?如果是不同对象,那buildDetailT的BuildTime根本没被赋值,自然是NULL,这肯定会触发数据库的非空约束报错。这个笔误很容易被忽略,先确认两者的关系。验证赋值结果是否有效:在赋值后加一行调试输出,比如
Debug.WriteLine(buildDetail.BuildTime),看看这个值是不是真的被正确计算出来了。会不会Double.Parse(buildTime)抛出了异常但被上层代码吞了?或者epoch的初始值有问题,导致最终得到的是DateTime.MinValue这类特殊值,EF映射时把它当成NULL处理了?核对EF实体的映射配置:
- 确认实体类里的
BuildTime属性有没有标记[Required]特性? - 有没有用Fluent API配置
HasRequired(x => x.BuildTime)? - 数据库里的
BuildTime列确实是设置为不允许NULL的吗?如果EF映射里把这个属性设为可空,但数据库里是必填,就会出现这种矛盾报错。
- 确认实体类里的
检查上下文的状态跟踪:在调用
SaveChanges()之前,查看上下文对buildDetailT的跟踪状态:var entry = ps.dbEntities.Entry(buildDetailT); Console.WriteLine(entry.State); // 应该是Added Console.WriteLine(entry.Property(x => x.BuildTime).CurrentValue); // 确认这个值不是NULL要是这里的
CurrentValue是NULL,那说明上下文根本没接收到你设置的BuildTime值,得回头找赋值环节的问题。
内容的提问来源于stack exchange,提问作者user1554876
相关产品推荐
相关产品推荐

