SP.NET MVC项目中,使用entity framework添加数据遇到“从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”这个错误问题。后经过问题的排查,是由于C#代码中实体类所传入的DateTime类型属性没有赋值的原因,其中主要涉及到SQL Server 中datetime2的时间精度和日期范围的问题
在c#中,如果实体类的属性没有赋值,一般都会取默认值,比如int类型的默认值为0,string类型默认值为null, 那DateTime的默认值呢?由于DateTime的默认值为"0001-01-01",所以entity framework在进行数据库操作的时候,在传入数据的时会自动将原本是datetime类型的数据字段转换为datetime2类型(因为0001-01-01这个时间超出了数据库中datetime的最小日期范围),然后在进行数据库操作。问题来了,虽然EF已经把要保存的数据自动转为了datetime2类型,但是数据库中表的字段还是datetime类型!所以将datetime2类型的数据添加到数据库中datetime类型的字段里去,就会报错并提示转换超出范围。
eg:
Item.ModifyDate = "{0001/1/1 0:00:00}"; // 此为 datetime2类型. datetime2的日期范围是"0001-01-01 到 9999-12-31"
而数据库上是 ModifyDate datetime // datetime的日期范围是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“
这样做就等于把 datetime2赋值给datetime 数据库类型转换就会错误.
根本原因就是没有赋值.
解决方法:
public DateTime? ModifyDate { get; set; }
改为
public DateTime ModifyDate { get; set; }
其他解决方法:
- C#代码中 DateTime类型的字段在作为参数传入到数据库前记得赋值,并且的日期要大于1753年1月1日。
- C#代码中 将原本是DateTime类型的字段修改为DateTime?类型,由于可空类型的默认值都是为null,所以传入数据库就可以不用赋值,数据库中的datetime类型也是支持null值的。
- 修改数据库中表的字段类型,将datetime类型修改为datetime2类型
参考:
http://shiyousan.com/post/635391523296425502