当值为 null 时,实体框架 6 中的可为 Null DateTime 属性在保存时会引发异常

Ado*_*rez 4 .net c# datetime entity-framework-6

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

public DateTime? ControlDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

控制日期为空

问题是,当我保存实例时,ControlDate=null出现以下异常:

conversion of a datetime2 data type to a datetime data type
resulted in an out-of-range value
Run Code Online (Sandbox Code Playgroud)

我读过多篇相关的帖子和​​文章,说这种情况通常发生在您定义不可为空的 DateTime 属性并尝试在之前未设置有效日期的情况下保存它时,有些人建议将该属性设置为可空,以防属性值可以为空。 null(这是我的特殊情况)。

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

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

编辑::这是一个非常相似的问题。非常详细的解释,如果有人感兴趣的话。

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

myObject.ControlDate = new DateTime()
Run Code Online (Sandbox Code Playgroud)

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

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

Joe*_*Joe 5

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