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

保存时,返回一个错误:

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

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

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

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

问题

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


当前回答

看看下面两个: 1)该字段没有NULL值。例如:

 public DateTime MyDate { get; set; }

替换:

public DateTime MyDate { get; set; }=DateTime.Now;

2)重新创建数据库。例如:

db=new MyDb();

其他回答

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

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

有时EF不知道它是在处理计算列还是触发器。按照设计,这些操作将在插入操作后的EF之外设置一个值。

修复方法是在EF的edmx中为StoreGeneratedPattern属性中的列指定Computed。

对我来说,这是当列有一个插入当前日期和时间的触发器时,参见下面的第三部分。


解决方法

在Visual Studio中打开模型浏览器页面,然后是模型,然后是实体类型->

选择实体和日期时间属性 选择StoreGeneratedPattern 设置为Computed


对于这种情况,其他答案是变通的,因为列的目的是在创建记录时指定一个时间/日期,而SQL的任务是执行一个触发器来添加正确的时间。例如下面的SQL触发器:

DEFAULT (GETDATE()) FOR [datecrecreated]。

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年或其他什么-但这完全取决于您可以在哪里控制更改内容。

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

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

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