【问题标题】:Entity Framework not claiming datetime.now is null实体框架未声明 datetime.now 为空
【发布时间】: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 是对的人,我什至没有意识到这一点。我真的很惊讶他能够根据错误猜测出来。就像......哇。

标签: c# sql-server entity-framework datetime


【解决方案1】:

当 EF 模型和数据库之间所谓的“存储生成模式”不匹配时,几乎总是会发生这种情况。如果模型列具有存储生成的 Identity 或 Computed 模式 - 这意味着 EF 将确保这些值将由数据库在插入或更新时自动提供,并且无需将它们包含在 INSERT 或 UPDATE 语句中。缺失值将具有默认的 NULL 值,如果此列同时在数据库中不可为空,并且不是真正计算或标识的 - 您有问题。

【讨论】:

    【解决方案2】:

    对不起,伙计们,我觉得自己像个白痴。感谢 Leopard。

    我去找 UVCUpdate 类给他看,并意识到当我从另一个类中复制该类时,我不小心将 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 留在了 CurrentDate 类中。所以它可能试图向 SQL 发送一个空值,以便 SQL 创建一个 ID,但该字段被设置为不允许空值。 CurrentDate 不应该是一个 ID,所以我删除了它,现在它可以工作了......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多