【问题标题】:EF Core - Conversion failed when converting date and/or time from character stringEF Core - 从字符串转换日期和/或时间时转换失败
【发布时间】:2020-04-21 09:15:29
【问题描述】:

尝试对具有某些 DateTimeOffset 成员的对象执行 dotnet ef 数据库更新。但我收到以下错误:

从字符转换日期和/或时间时转换失败 字符串。

这是我试图映射到 sql 的模型:

 public int SessionId { get; set; }
 public int SpeakerId { get; set; }
 public string Title { get; set; }
 public TimeSpan Length { get; set; }
 public DateTimeOffset ScheduledAt { get; set; }
 public DateTimeOffset Submitted { get; set; }
 public string Description { get; set; }

下面是我的 dbcontext 代码:

    public DbSet<Core.Models.Session> Sessions { get; set; }

    protected override void OnModelCreating (ModelBuilder modelBuilder) {

        var dateTimeOffsetConverter = new ValueConverter<DateTimeOffset, string> (
                v => v.ToString ("yyyy-MM-dd HH:mm:ss zzz"),
                v => DateTimeOffset.Parse (v));

        modelBuilder
            .Entity<Core.Models.Session> ()
            .Property (s => s.ScheduledAt)
            .HasColumnType ("datetimeoffset");

        modelBuilder
            .Entity<Core.Models.Session> ()
            .Property (s => s.Submitted)
            .HasColumnType ("datetimeoffset");


        modelBuilder.Entity<Core.Models.Session> ().HasData (MockSessionData.Sessions);

    }

以下是为创建一些假数据而生成的 SQL 脚本:

INSERT INTO [Sessions] ([SessionId], [Description], [Length], [ScheduledAt], [SpeakerId], [Submitted], [Title])

VALUES (1, N'overview of new features of dotnet core 3.1', '00:40:00', '2020-08-03T13:00:00.0000000+01:00', 1, '2019-12-03T13:00:00.0000000+01:00', N'dotnet core 3.1');

我尝试使用生成的脚本但 dotnet ef 手动将数据插入到 sql 中,但我得到了同样的错误。当我使用 SQL CAST() 方法使用以下格式时,我确实设法让它工作:

CAST('2019-12-03 13:00:00.0000000 +01:00' AS datetimeoffset)

但我不确定如何使用 ef core 或是否有可能做到这一点?

我正在使用 sql server docker 容器。

系统规格:

dotnet 核心 3.1

SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64)

与代码 1.44.2

【问题讨论】:

    标签: c# .net visual-studio-code sql-server-2017 ef-core-3.1


    【解决方案1】:

    所以我发现问题不是 datetimeoffset 而是时间跨度,因为我添加了超过一天的其他时间跨度值。这导致插入脚本将时间跨度值格式化为“1.00:30:00”。这导致了转换错误。

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多