SQL Server查询遇类型转换错误:TimeSpan与DateTime互转失败求助
问题:SQL Server项目中从Randevular表读取数据时出现类型转换异常
初始报错信息
Unable to cast object of type 'System.TimeSpan' to type 'System.DateTime'
相关代码与配置
Randevu实体模型类
public class Randevu { [Key] public int RandevuID { get; set; } [Required] public DateTime RandevuDate { get; set; } [Required] public DateTime RandevuTime { get; set; } }
迁移模型快照
modelBuilder.Entity("webProgProje.Models.Randevu", b => { b.Property<int>("RandevuID") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("RandevuID")); b.Property<DateTime>("RandevuDate") .HasColumnType("datetime2"); //注:应用到数据库前已改为"date" b.Property<DateTime>("RandevuTime") .HasColumnType("datetime2"); //注:应用到数据库前已改为"time" b.HasKey("RandevuID"); b.ToTable("Randevular"); });
migration.cs文件内容
migrationBuilder.CreateTable( name: "Randevular", columns: table => new { RandevuID = table.Column<int>(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), RandevuDate = table.Column<DateTime>(type: "datetime2", nullable: false), //注:已改为"date" RandevuTime = table.Column<DateTime>(type: "datetime2", nullable: false), //注:已改为"time" });
已尝试操作及新报错
- 将模型中
RandevuTime的DateTime改为TimeSpan,报错变为:Unable to cast object of type 'System.DateTime' to type 'System.TimeSpan'
- 尝试在应用迁移前,手动修改migration.cs和快照中的
DateTime为TimeSpan,问题依旧存在。
解决方案
核心问题是EF Core实体类型与数据库列类型未正确映射,手动修改迁移文件但未同步实体配置导致类型转换冲突。正确处理步骤如下:
修正实体类属性类型
数据库中RandevuDate为date类型,对应EF Core的DateTime无问题;RandevuTime为time类型,必须对应TimeSpan:public class Randevu { [Key] public int RandevuID { get; set; } [Required] public DateTime RandevuDate { get; set; } [Required] public TimeSpan RandevuTime { get; set; } }重新生成并应用迁移(推荐)
不要手动修改现有迁移文件,直接重置迁移流程:# 若迁移已应用到数据库,先回滚到初始状态 Update-Database -Migration 0 # 删除现有迁移文件(包括快照) Remove-Migration # 重新生成正确的迁移 Add-Migration InitialCreate # 将迁移应用到数据库 Update-Database手动修正迁移文件(若无法重置迁移)
确保迁移文件和快照中类型与实体、数据库完全匹配:- 修改migration.cs中
RandevuTime的定义:RandevuTime = table.Column<TimeSpan>(type: "time", nullable: false) - 修改模型快照中对应属性配置:
b.Property<TimeSpan>("RandevuTime") .HasColumnType("time");
执行
Update-Database重新应用迁移即可。- 修改migration.cs中
内容的提问来源于stack exchange,提问作者Mhanzo
相关产品推荐
相关产品推荐

