You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实体类型与数据库列类型未正确映射,手动修改迁移文件但未同步实体配置导致类型转换冲突。正确处理步骤如下:

  1. 修正实体类属性类型
    数据库中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; }
    }
    
  2. 重新生成并应用迁移(推荐)
    不要手动修改现有迁移文件,直接重置迁移流程:

    # 若迁移已应用到数据库,先回滚到初始状态
    Update-Database -Migration 0
    # 删除现有迁移文件(包括快照)
    Remove-Migration
    # 重新生成正确的迁移
    Add-Migration InitialCreate
    # 将迁移应用到数据库
    Update-Database
    
  3. 手动修正迁移文件(若无法重置迁移)
    确保迁移文件和快照中类型与实体、数据库完全匹配:

    • 修改migration.cs中RandevuTime的定义:
      RandevuTime = table.Column<TimeSpan>(type: "time", nullable: false)
      
    • 修改模型快照中对应属性配置:
      b.Property<TimeSpan>("RandevuTime") 
          .HasColumnType("time");
      

    执行Update-Database重新应用迁移即可。

内容的提问来源于stack exchange,提问作者Mhanzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:23:21