实体框架未声明 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 为空的主要内容,如果未能解决你的问题,请参考以下文章

更新文化短时间模式格式未进入 DateTime.now

datetime

datetime处理日期和时间

为 DateTime 声明 obs 类型的正确方法是啥?

time 与 data time

未提供的参数化查询。实体框架