【问题标题】:SaveChangesAsync Error: Conversion of DateTime2 to DateTime Out-Of-RangeSaveChangesAsync 错误:DateTime2 到 DateTime 的转换超出范围
【发布时间】:2015-09-27 13:01:45
【问题描述】:

我知道这个问题已在 StackOverflow 上被问过很多次,但似乎没有一个答案适合我的情况,或者他们只是告诉他们在他们的 DateTime 中允许 NULL 字段(我不想这样做) .

代码如下:

public async Task<int> CreateJobAsync(JobViewModel jvm)
    {
        Job j = new Job();
        j.Name = jvm.Name;
        j.UserId = jvm.UserId;
        j.ClassDefinition = jvm.ClassDefinition;
        j.DaysToRun = jvm.DaysToRun;
        j.ToEmail = jvm.ToEmail;
        j.Active = true;
        j.CreatedDate = DateTime.Now;
        j.ModifiedDate = DateTime.Now;

        context.Jobs.Add(j);
        var result = await context.SaveChangesAsync();

        return result;
    }

Job 类中的所有字段都是DateTime,数据库中的对象也是如此。日期值不是NULL。当我运行 Sql Profiler 时,它甚至没有显示进行了数据库调用。

await 调用时发生错误,它是:

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

这似乎是一个相当简单的示例,我确实需要将这些值设为not null。还有其他想法吗???

【问题讨论】:

    标签: c# entity-framework datetime async-await


    【解决方案1】:

    Job 中必须有其他类型为 DateTime 的字段在您的代码中未设置。此未设置的属性将默认为 DateTime.MinValue,即 0001 年 1 月 1 日。 SQL 类型 DATETIME 仅支持年份大于 1752 的日期。因此,您的异常的原因。

    最简单的解决方案是将数据库更改为使用 DATETIME2 而不是 DATETIME。另见DateTime2 vs DateTime in SQL Server

    【讨论】:

    • 让我研究这个。看到你的回答后,我查看了 Job.cs,里面还有另一个类。而且,该类中有一个 DateTime。
    • 就是这样。 Job 中引用的类有一个默认为 DateTime.MinValue 的 DateTime。谢谢!
    【解决方案2】:

    DateTime 是 .Net 中的值类型,永远不会为空。

    现在,话说回来,DateTime 的默认值为DateTime.MinValue in C# 等于01/01/0001,除非另有说明,否则所有DateTime 字段默认获取此值!但是,此日期超出了SQLServer 日期范围,其中最短日期为1/1/1753。可能这就是您收到此异常的原因。

    使您的代码可用的一种方法是使用SqlDateTime.MinValue 而不是 DateTime.MinValue。

    【讨论】:

    • 在我的代码中,我将值设置为 DateTime.Now,我什至尝试对今天的日期进行硬编码,但仍然出现相同的错误。我不确定它为什么会使用 DateTime.MinValue。永远不会得到空值的观点是有效的,所以我会尝试更改我的数据库。
    • @L_7337 在代码中的某处,某些日期时间字段可能未初始化或格式错误。有很多方法可以解决这个问题 - 请使用“将 datetime2 数据类型转换为 datetime 数据类型导致超出范围的值”来搜索多个现有答案。
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2023-03-30
    • 2011-08-28
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多