【问题标题】:An overflow occurred while converting to datetime using EF4使用 EF4 转换为日期时间时发生溢出
【发布时间】:2011-10-07 12:49:49
【问题描述】:

我有一个 Windows 应用程序使用 SQL Compact 4.0 数据库,使用 EF 4.1 和代码优先方法。 我无法将对象保存到数据库,因为我遇到了异常,内部异常 “转换为日期时间时发生溢出” 尝试保存类型报价时:

public class Quotation
{
    public int ID { get; set; }

    public string Name { get; set; }

    public DateTime DateCreated { get; set; }

    public ContactPerson ContactPersonAssigned { get; set; }

    public string OurReference { get; set; }

    public string QuotationDataString { get; set; }
}

我了解到此错误可能是由于我的应用程序设置与关于日期转换的 sql compact 数据库设置不匹配造成的。 我不确定,因为我的 sdf 数据库文件有一个正确命名为“DateCreated”、不可为空且类型为“datetime”的字段。

我是 SQL compact 的新手。你能帮我调试一下这个问题吗?

【问题讨论】:

  • 您是否将应用程序中的DateCreated 设置为DateTime.Now?
  • 我犯了一个愚蠢的错误。代码中的某处 DateCreated 为空。
  • 您能以对他人有所帮助的方式回答您自己的问题吗?如果你这样做,你可以选择你的作为正确答案。这可能看起来很奇怪,但它是处理此类情况的首选方式。

标签: asp.net-mvc ef-code-first entity-framework-4.1 sql-server-ce


【解决方案1】:

如果您的模型具有 DateTime 类型的不可为空的属性,当您发布该属性的值为空的表单时,它会自动设置为 DateTime.MinValue,它位于 .net 01/01/0001 (DateTime.MinValue on MSDN )

(作为附注,您可以通过为 DateTime 实现自己的 IModelBinder 来更改此行为,即,如果尝试的值为空/空且属性不可为空,则可能引发验证异常。

如果您尝试将该值 (DateTime.MinValue) 保存到数据库中,如果数据库字段是 sql 类型 datetime,您将收到转换错误,因为 .net DateTime.MinValue 小于 SQL datetime minvalue (01/01/1753 ),因此无法转换为 sql 值。 (SQL datetime min value on MSDN)

此错误不会发生在较新版本的 MS SQL Server 上,它具有 datetime2 数据类型,允许值从 01/01/0001 到 31/12/9999 (SQL datetime2 on MSDN)(如果 datetime2 用于该字段,则当然)。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,保存在数据库对象上的 dateTime 属性最初为 null。

    在将对象保存到本地 CE 数据库之前验证是否已分配实际日期时间。

    【讨论】:

      【解决方案3】:

      这是一个老问题......但也许有人会觉得这很有帮助:

      我使用以下定义解决了问题(MVC4、EF5、SqlServerCE 4.0):

      public DateTime? DateFrom { get; set; }
      public DateTime? DateTo { get; set; }
      

      玩得开心!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多