EF6 datetime2 转换为 datetime 导致值超出范围

Posted

技术标签:

【中文标题】EF6 datetime2 转换为 datetime 导致值超出范围【英文标题】:EF6 datetime2 conversion to datetime resulted in an out-of-range value 【发布时间】:2016-08-23 17:41:32 【问题描述】:

我刚刚部署了一周前可以正常工作的服务器代码。导致错误的代码部分没有改变,但是对象本身发生了变化。

这是一种模型优先的方法(从数据库优先转换而来),我在模型中添加了两个关联字段和两个新表。

引发错误的代码部分是关键任务。它基本上通过设置时间戳来禁用值的并发编辑。但是由于某种原因,它不起作用。

具体代码:

user.AlertConcurrency = DateTime.UtcNow;
db.SaveChanges();

错误:

将 datetime2 数据类型转换为 datetime 数据类型 导致超出范围的值。该语句已终止。

现在,user.AlertConcurrency 字段是数据库中的日期时间类型。我不明白为什么它甚至试图在这里进行 datetime 到 datetime2 的转换。我错过了什么?

【问题讨论】:

这可能意味着有另一个 DateTime 属性为空,但在数据库中不可为空。 这是否对已保存在数据库中的数据失败?听起来您将数据存储为datetime2,它没有datetime 的有效值。 对this question的答案有帮助吗? @GertArnold 因为我之前保存了用户对象,它包含所有必需的日期时间字段为非空,我不修改任何这些字段,我怀疑是这种情况。跨度> @Charles 我在数据库中没有任何 datetime2 字段,只有日期时间。 【参考方案1】:

datetime2 的范围比 datetime 更大,因此您可能有一个 null datetime2,即“0001/01/01”试图转换为最小值为“1753/01/01”的日期时间,因此转换失败.因此,空 C# DateTime 属性将是导致问题的 datetime2 值。

检查您的模型是否已完全更新/与您的数据库同步,并检查您的 DateTime 属性中的空值。如果您有空数据库值或想要保存空 DateTime,请考虑在您的模型和数据库中使用可为空的 DateTime。

【讨论】:

我没有在数据库中使用任何 datetime2 - 我专门检查了它,所有字段都是 datetime。我确实有一些空日期时间,但默认情况下它们可以为空。 记住 datetime 是较小的日期范围。您的 c# DateTime 空值是 LARGE datetime2 "0001/01/01" 因此当 SQL 尝试将其保存到您的 SMALLER 日期时间时,它超出了范围。 datetime 只能达到“1753/01/01”。 是否有任何首选方法可以让 Model First 生成的数据库使用 datetime2 而不是 datetime? modelBuilder.Properties<DateTime>() .Configure(c => c.HasColumnType("datetime2"));

以上是关于EF6 datetime2 转换为 datetime 导致值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

EF6中一个关于时间类型 datetime2 的坑

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围 - 未使用 DateTime2

将 datetime2 数据类型转换为 datetime 数据错误

将 datetime2 数据类型转换为 datetime 数据类型会导致值超出范围

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围