当值为null时,Entity Framework 6中的Nullable DateTime属性在save时抛出异常

时间:2014-09-02 12:32:49

标签: c# .net datetime entity-framework-6

我在其中一个类中定义了一个Nullable DateTime属性:

public DateTime? ControlDate { get; set; }

当使用EF 6 CodeFirst从我的模型生成数据库(SQL Server 2008)时,我得到:

ControlDate null

问题是当我用ControlDate=null保存我的实例时,我得到了这个例外:

conversion of a datetime2 data type to a datetime data type
resulted in an out-of-range value

我已阅读多篇相关帖子和文章,说这通常发生在你身上 定义一个不可为空的DateTime属性并尝试保存它,而不设置之前的有效日期, 有些人建议将属性设置为可为空,以防属性值为null(这是我的特例)。

我的问题是:为什么当我的属性和列类型可以为空时,EF会尝试设置默认日期。 Null应该是一个有效值,并且应该一直流到数据库,而不需要在它们之间进行任何其他转换。

这是一篇相关文章:Conversion of a datetime2 data type to a datetime data type results out-of-range value

编辑:: Here is a very similar question。非常详细的解释,如果有人有兴趣。

经验教训:只是想澄清一下,仔细观察后,我发现这是我身上的一个问题。在保存我的对象之前,它被设置为:

myObject.ControlDate = new DateTime()

在检查时,它显示默认的不兼容日期1/1/0001。众所周知,这会导致此异常。所以我的结论是:

  • 声明不可为空的DateTime属性的模型将在SQL Server中生成datetime数据类型。
  • 声明可以为DateTime属性的类的实例将能够保存到数据库为null
  • 非常重要手动设置有效的默认日期(如果<> NULL),否则会将其设置为1/1/0001并抛出异常

1 个答案:

答案 0 :(得分:4)

据我所知,实际上SQL Server datetime2类型直接映射到.NET的DateTime类型,因此您可能需要在SQL Server中更改列的类型