linq 无法将“System.TimeSpan”类型的对象强制转换为“System. DateTime”类型,尝试从SQL Server获取数据时出错

fjnneemd  于 6个月前  发布在  SQL Server
关注(0)|答案(2)|浏览(86)

我目前正在处理一个使用SQL Server的项目。我试图从Randevular表中获取数据。但是当我运行linq代码时,它没有返回任何数据。我得到一个错误
无法将类型为“System.TimeSpan”的对象强制转换为类型"System.DateTime“
下面是我的Randevu模型类:

public class Randevu
{
    [Key]
    public int RandevuID { get; set; }
    [Required]
    public DateTime RandevuDate { get; set; }
    [Required]
    public DateTime RandevuTime {  get; set; }
}

字符串
下面是Randevular表的迁移模型快照:

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"); //NOTE: i changed "datetime2" to "date" BEFORE applying to database

        b.Property<DateTime>("RandevuTime") 
            .HasColumnType("datetime2"); //NOTE: i changed "datetime2" to "time" BEFORE applying to database

        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), //NOTE: i changed "datetime2" to "date"
        RandevuTime = table.Column<DateTime>(type: "datetime2", nullable: false), //NOTE: i changed "datetime2" to "time"
});


我只是想列出所有的Randevu的存储在数据库中,但我陷入了这个奇怪的问题。
我尝试在Randevu model中将“DateTime”更改为“TimeSpan”并运行它,再次发生相同的错误。但这一次是:
无法将“System.DateTime”类型的对象强制转换为“System.TimeSpan”类型
我还尝试在应用到数据库之前将migration.cs文件和快照中的所有DateTime更改为TimeSpan,但同样的问题仍然存在。

wn9m85ua

wn9m85ua1#

我找到了一个解决方案.一切都解释在这个链接:
https://erikej.github.io/efcore/sqlserver/2023/09/03/efcore-dateonly-timeonly.html
以下是我为解决这个问题所做的事情。
我无法运行console命令,但我也找到了一种方法。在Visual Studio中,转到:
工具-> NuGet软件包管理器->管理NuGet软件包以解决.
从那里,单击浏览选项卡并搜索:
ErikEJ.EntityFrameworkCore.SqlServer.DateOnlyTimeOnly
现在,在打开的窗口中选择您的项目并安装最新的稳定版本。
我将Randevu模型类从

public class Randevu
{
    [Key]
    public int RandevuID { get; set; }
    [Required]
    public DateTime RandevuDate { get; set; }
    [Required]
    public DateTime RandevuTime {  get; set; }
}

字符串
收件人:

public class Randevu
{
    [Key]
    public int RandevuID { get; set; }
    [Required]
    public DateOnly RandevuDate { get; set; }
    [Required]
    public TimeOnly RandevuTime {  get; set; }
}


然后将DbContext模型类中的OnConfiguring方法从:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=localhost\MSSQLSERVER02;Database=master;
          Trusted_Connection=True;
          TrustServerCertificate=True");
    }


收件人:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=localhost\MSSQLSERVER02;Database=master;
          Trusted_Connection=True;
          TrustServerCertificate=True",x=>x.UseDateOnlyTimeOnly());
    }


迁移后,
Randevular表的迁移模型快照如下所示:

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"); 

        b.Property<DateTime>("RandevuTime") 
            .HasColumnType("datetime2"); 

        b.HasKey("RandevuID");

        b.ToTable("Randevular");
    });


为此:

modelBuilder.Entity("webProgProje.Models.Randevu", b =>
    {
        b.Property<int>("RandevuID")
            .ValueGeneratedOnAdd()
            .HasColumnType("int");

        SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("RandevuID"));

        b.Property<DateOnly>("RandevuDate")
            .HasColumnType("date"); 

        b.Property<TimeOnly>("RandevuTime") 
            .HasColumnType("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),
        RandevuTime = table.Column<DateTime>(type: "datetime2", nullable: false),
});


为此:

migrationBuilder.CreateTable(
    name: "Randevular",
    columns: table => new
    {
        RandevuID = table.Column<int>(type: "int", nullable: false)
            .Annotation("SqlServer:Identity", "1, 1"),
        RandevuDate = table.Column<DateOnly>(type: "date", nullable: false), 
        RandevuTime = table.Column<TimeOnly>(type: "time", nullable: false), 
});


在所有这些步骤之后,它工作得很好。我在从服务器请求数据时没有收到任何错误。
结果,
存储的数据是:
Randevu日期:2023年12月12日,Randevu时间:10:00:00)
我从数据库中得到的值,
日期值:
年2023月12日12 DayOfWeek星期二DayOfYear 346日编号738865
时间值:
小时10分钟0秒0毫秒0滴答3600000000
我认为我们可以从现在开始将输出字符串操作为我们想要显示的格式。

izj3ouym

izj3ouym2#

TimeSpan timeSpanValue = (TimeSpan)reader["timeSpanColumn"];
DateTime dateTimeValue = DateTime.Now.Add(timeSpanValue);

字符串

相关问题