我的Code First模型具有System.DateTime
属性。调用数据库种子代码时,它会抛出此异常:
SqlException(0x80131904):将datetime2数据类型转换为日期时间数据类型会导致超出范围的值。
我正在使用构造函数创建一个新的DateTime
对象。 Code First正在创建数据库模式。如何克服Code First中的这个明显错误?我并不特别关注我的数据类型。我只需要存储一个日期,也可以选择存储一天中的时间,但这并不重要。
我搜索并阅读了很多帖子,但是没有这个错误指出它们来自CodeFirst生成的数据方案。我发现最接近的答案涉及对ProviderManifestToken
文件中的edmx
进行更改,但我的项目没有edmx
文件。我没有使用设计器,我正在使用Code First。
答案 0 :(得分:3)
将.NET中的DateTime
映射到SQL Server中的datetime
。类型具有不同的范围:datetime
只能存储晚于1750年左右的日期。如果您尝试在实体中存储具有较早日期或已整合DateTime
的{{1}}(哪一年有1)你得到异常,因为SQL Server无法存储它。
解决方案:
DateTime
属性展示给SQL Server中的DateTime
,其范围更广。示例如何使用Fluent API定义此映射:https://stackoverflow.com/a/8044310/270591 实际上我也曾期望默认映射到datetime2
,因为它更适合.NET中的datetime2
。但出于某种原因,他们决定使用DateTime
作为默认值。
答案 1 :(得分:0)
很抱歉,经过更仔细的调试,我发现错误来自数据实体初始化,而我没有为DateTime
指定任何值。
我原以为它来自一个涉及新DateTime(2012, 2, 19, 19, 0, 0)
或其他类似内容的长数据种子声明。感谢Slauma的努力 - 他说这是正确的,因为它是由于单一化的价值观。