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

保存时,返回一个错误:

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

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

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

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

问题

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


当前回答

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

01/01/0001 00:00:00

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

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

其他回答

我意识到了这个问题,你们也应该意识到:

https://en.wikipedia.org/wiki/Year_2038_problem

在SQL中,创建了一个新的字段类型来避免这个问题(datetime2)。

这个“Date”字段类型与DateTime . net类具有相同的范围值。它将解决您的所有问题,所以我认为解决它的最佳方法是改变数据库列类型(这不会影响您的表数据)。

在我的SQL Server 2008数据库中,我有一个标记为不可空的DateTime列,但有一个GetDate()函数作为其默认值。当使用EF4插入新对象时,我得到了这个错误,因为我没有显式地在对象上传递DateTime属性。我期望SQL函数为我处理日期,但它没有。我的解决方案是从代码中发送日期值,而不是依赖数据库来生成它。

obj.DateProperty = DateTime.now; // C#

有时它在开发机器上工作得很好,而在服务器上则不行。在我的例子中,我必须写:

<globalization uiCulture="es" culture="es-CO" />

在网络上。配置文件。

机器(服务器)中的时区是正确的(CO地区),但web应用程序不是。这个设置完成了,它再次工作正常。

当然,所有的约会都是有价值的。

:D

我在一个简单的控制台应用程序项目中遇到了这个问题,我的快速解决方案是通过运行这个方法将任何可能的datetime2日期转换为可空的datetime:

static DateTime? ParseDateTime2(DateTime? date)
    {
        if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
        {
            return null;
        }
        else
        {
            return date;
        }
    }

这当然不是一个完全全面的方法,但它满足了我的需要,也许它会帮助其他人!

Code First上下文:

从这里开始

    public DateTime Created { get; set; }

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

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

在你的模型中。

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

using System.ComponentModel.DataAnnotations.Schema;