我有一个5列的数据表,其中一行被数据填充,然后通过事务保存到数据库。

保存时,返回一个错误:

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

它暗示,正如阅读,我的数据表有一个类型的DateTime2和我的数据库一个DateTime;这是错误的。

date列设置为DateTime,如下所示:

新数据专栏(“myDate, Type.GetType”)

问题

是否可以在代码中解决这个问题,或者是否必须在数据库级别上更改某些内容?


当前回答

Code First上下文:

从这里开始

    public DateTime Created { get; set; }

这个。添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性。

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime Created { get; set; }

在你的模型中。

一定要把这个也加到最上面

using System.ComponentModel.DataAnnotations.Schema;

其他回答

最简单的方法是将数据库更改为使用datetime2而不是datetime。兼容性工作得很好,你不会得到你的错误。

你仍然需要做一堆测试……

这个错误可能是因为您试图将日期设置为0年或其他什么-但这完全取决于您可以在哪里控制更改内容。

在我的例子中,我们将一个Date转换为一个Datetime,我们得到了这个错误。 结果是Date具有“更面向程序员”的最小值01/01/0001,而Datetime则停留在1753

将此与我们的数据收集错误结合起来,您就得到了异常!

简短的回答

如果没有初始化DateTime字段的值,就会发生这种情况;该字段不接受NULL值,并且它是一个值类型,因此将使用不可空的DateTime类型的默认值。

设置值固定它为我!

长回答

默认值(DateTime)为DateTime。MinValue(或新的DateTime(1,1,1)或01/01/0001),这不是一个有效的SQL日期时间值。

由于使用的是公历,SQL Server datetime的最低有效值是01/01/1753。但是SQL Server DateTime2支持从01/01/0001开始的日期。实体框架默认使用DateTime2来表示日期,因此生成的SQL隐式地将生成的DateTime2值强制转换为SQL服务器端的DateTime值。

对我来说,这是因为约会时间是…

01/01/0001 00:00:00

在这种情况下,你想要分配null给你EF DateTime对象…以我的FirstYearRegistered代码为例

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
    vehicleData.DateFirstReg = FirstYearRegistered;
}  

正如andyuk已经指出的那样,当NULL值被分配给一个不可空的DateTime字段时,就会发生这种情况。考虑将DateTime更改为DateTime?或可空< DateTime >。请记住,如果您正在使用依赖属性,还应该确保您的依赖属性的类型也是一个可空的DateTime类型。

下面是一个不完整的DateTime到DateTime的真实示例?引起奇怪行为的类型调整