23

我有一个使用EF 4.1和代码优先的方法使用SQL Compact 4.0数据库的Windows应用程序。使用EF4转换为日期时发生溢出

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; } 
} 

,我读了这一点: 我不能,因为我发现了一个异常的对象保存到数据库中,与内部异常 试图保存的文件类型报价时 “在转换成datetime时发生溢出”错误可能是由于我的应用程序设置和sql compact数据库设置之间关于转换日期不匹配所致。 我不太确定,因为我的sdf数据库文件有一个正确命名为“DateCreated”,不可为空且类型为“datetime”的字段。

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

+3

您是否在您的应用程序中将DateCreated设置为DateTime.Now? –

+1

我犯了一个愚蠢的错误。代码中的某处DateCreated为空。 – Francesco

+2

你能以一种能够帮助他人的方式回答你自己的问题吗?如果你这样做,你可以选择你的正确答案。这看起来很奇怪,但它是处理这种情况的首选方式。 – Will

回答

87

如果您的模型具有DateTime类型的非空值属性,则当您发布该属性为空值的表单时,它会自动设置为.net 01/01/0001(DateTime.MinValue on MSDN)中的DateTime.MinValue。 (作为一个方面说明,你可以通过为DateTime实现你自己的IModelBinder来改变这种行为,如果尝试值为空/空并且属性不可为空,则可以抛出验证异常)。

如果您尝试保存值(DateTime.MinValue)到数据库中,你会得到转换错误,如果数据库字段是SQL datetime类型的,因为.NET DateTime.MinValue小于SQL日期时间MINVALUE(1753年1月1日)因此无法转换为sql值。 (SQL datetime min value on MSDN

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

+6

看到这样的好答案不被接受,真让人遗憾。 –

+0

谢谢。很好的答案 –

1

这是一个老问题...但也许有人能有所帮助:

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

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

玩得开心!

1

我讨厌同样的问题,最初在对象上保存datetime的原因是null。

确保在将对象保存到本地CE数据库之前已经分配了实际的日期时间。