Entity Framework保存数据时datetime2转datetime溢出错误如何修复
问题原因
你遇到的报错本质是SQL Server的datetime数据类型和C#的DateTime类型范围不匹配导致的:
- SQL Server的
datetime类型支持的日期范围是 1753-01-01 到 9999-12-31 - C#的
DateTime默认值是0001-01-01,属于.NET默认的datetime2范围,这个值超出了SQL Serverdatetime的合法范围,转换时就会抛出越界异常。
结合你提供的实体类,大概率是新建AccountObject对象时没有给非可空的CreatedDate字段赋值,字段用了默认的0001-01-01,保存时触发了转换报错。
修复方案
你可以任选以下一种方案解决:
方案1:显式给所有日期字段赋值合法值
新建AccountObject对象时,必须给非可空的CreatedDate赋值合法日期,比如:// 保存前添加这行代码,用本地时间或者UTC时间根据你的业务需求调整 newAccountObj.CreatedDate = DateTime.Now;对于
BirthDate、IssueDate、ModifiedDate这类可空日期字段,如果没有业务值就保持null,不要赋值为DateTime.MinValue。方案2:修改EF映射规则,统一用
datetime2类型
在你的DbContext的OnModelCreating方法中添加全局配置,让所有.NET日期类型映射到SQL Server的datetime2类型(范围和.NET DateTime完全匹配),避免转换问题:protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 全局配置所有DateTime和DateTime?都映射为datetime2 modelBuilder.Properties<DateTime>() .Configure(c => c.HasColumnType("datetime2")); modelBuilder.Properties<DateTime?>() .Configure(c => c.HasColumnType("datetime2")); }方案3:直接修改数据库字段类型
将数据库中AccountObject表对应的所有datetime类型字段修改为datetime2类型,该类型是SQL Server更推荐的日期类型,精度更高且和.NET的DateTime范围完全兼容,不会出现转换越界问题。
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

