实体框架未声明 datetime.now 为空
Posted
技术标签:
【中文标题】实体框架未声明 datetime.now 为空【英文标题】:Entity Framework not claiming datetime.now is null 【发布时间】:2017-01-23 11:26:54 【问题描述】:这是我的代码:
UVCUpdate update = new UVCUpdate();
update.CurrentDate = DateTime.Now;
_context.UVCUpdates.Add(update);
_context.SaveChanges();
虽然这样说,但现在我得到了一个内部异常:
无法将值 NULL 插入列“CurrentDate”、表“bLinked.dbo.BlackbookUpdateUVC”;列不允许空值。插入失败。
如果我在此代码之前输出 DateTime.Now,它会输出:
2016 年 9 月 15 日晚上 7:26:35
我在数据库中的 CurrentDate 数据类型设置为日期时间,而在类中它设置为日期时间。两者都不允许空值,但 DateTime.Now 不应该为空,对吧?
【问题讨论】:
显示UVCUpdate
类的定义。
CurrentDate 很可能在您的模型中(错误地)存储生成模式 Identity 或 Computed,因此 EF 只是忽略那里提供的任何值。在数据库本身中,它不是标识或计算列,并且需要一个值。
顺便说一句,您可能希望使用datetime2
。您可以通过将这行代码放在上下文的 OnModelCreating()
覆盖中来添加它:modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
。
@Evk,哇,你猜对了。继续发布答案,我会接受!
Evk 是对的人,我什至没有意识到这一点。我真的很惊讶他能够根据错误猜测出来。就像......哇。
【参考方案1】:
当 EF 模型和数据库之间所谓的“存储生成模式”不匹配时,几乎总是会发生这种情况。如果模型列具有存储生成的 Identity 或 Computed 模式 - 这意味着 EF 将确保这些值将由数据库在插入或更新时自动提供,并且无需将它们包含在 INSERT 或 UPDATE 语句中。缺失值将具有默认的 NULL 值,如果此列同时在数据库中不可为空,并且不是真正计算或标识的 - 您有问题。
【讨论】:
【参考方案2】:对不起,伙计们,我觉得自己像个白痴。感谢 Leopard。
我去找 UVCUpdate 类给他看,并意识到当我从另一个类中复制该类时,我不小心将 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
留在了 CurrentDate 类中。所以它可能试图向 SQL 发送一个空值,以便 SQL 创建一个 ID,但该字段被设置为不允许空值。 CurrentDate 不应该是一个 ID,所以我删除了它,现在它可以工作了......
【讨论】:
以上是关于实体框架未声明 datetime.now 为空的主要内容,如果未能解决你的问题,请参考以下文章