查询预订数据时出现无法将String转为DateTime的InvalidCastException异常
异常原因
这个System.InvalidCastException异常是Entity Framework进行实体映射时触发的:你在C#模型中定义了FromDate、ToDate两个DateTime类型的属性,EF Core的Fluent API也配置了对应数据库字段类型为datetime2,但实际数据库的Booking表中,这两个字段的存储类型是字符串,或者存储的内容不符合DateTime的解析规则,读取时无法完成自动转换就抛出了该错误。
解决方案
- 修正数据库表结构
确认Booking表的FromDate和ToDate字段实际类型,如果是varchar/nvarchar类的字符串类型,直接修改字段类型为datetime2,同时将字段中已存储的日期字符串转换为标准的日期格式值。 - 配置值转换器(无需修改表结构时使用)
如果业务侧不允许修改数据库表结构,可在EF Core的实体配置中添加值转换器,手动实现字符串和DateTime的互相转换:// 针对FromDate字段配置,ToDate字段做相同处理即可 b.Property<DateTime>("FromDate") .HasColumnType("nvarchar(100)") // 替换为你数据库中对应字段的实际类型和长度 .HasConversion( date => date.ToString("yyyy-MM-dd HH:mm:ss"), // 写入数据库时DateTime转字符串 str => DateTime.Parse(str) // 读取数据库时字符串转DateTime ); - 清理脏数据
如果确认数据库字段已经是datetime2类型,检查表中是否存在空字符串、非法格式的异常日期值,清理这些不符合规则的脏数据即可解决转换报错。 - 增加容错处理
可将模型中FromDate和ToDate的类型修改为可空的DateTime?,避免字段为空时触发不必要的转换异常。
内容的提问来源于stack exchange,提问作者user1960836
相关产品推荐
相关产品推荐

