.net 如何将时间(0)Map到TimeOnly实体框架SQL Server 2019?

scyqe7ek  于 2022-12-30  发布在  .NET
关注(0)|答案(2)|浏览(122)

我尝试使用新的TimeOnly类型的C#,但当我开始执行迁移时,我遇到了以下问题。我使用的是SQL Server 2019,错误为。
属性“PassportOffice.CloseTime”的类型为“DateTime”,当前数据库提供程序不支持该类型。请更改该属性的CLR类型,或使用“[NotMapped]”特性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略该属性。
我使用的是实体框架核心6,模型如下。

public class PassportOffice
{
    public int Id { get; set; }
    [Required]
    public TimeOnly OpenTime { get; set; }
    [Required]
    public TimeOnly CloseTime { get; set; }
}

所以我试着做了TimeOnly转换器

public class TimeOnlyConverter : ValueConverter<TimeOnly, DateTime>
{
    public TimeOnlyConverter() : base(
       timeOnly => new DateTime(DateOnly.MinValue.Year, DateOnly.MinValue.Month, DateOnly.MinValue.Day,
            timeOnly.Hour, timeOnly.Minute, timeOnly.Second),
       dateTime => TimeOnly.FromDateTime(dateTime))
   { }
}

并在DbContext中使用它,如下所示

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
    configurationBuilder.Properties<TimeOnly>()
        .HaveConversion<TimeOnlyConverter>()
        .HaveColumnType("time(0)");
}

是我弄错了吗?还是有别的办法解决这个问题?

lnlaulya

lnlaulya1#

实体框架将CLR类型TimeSpanSQL Server类型Map到时间
按如下所示更改模型定义

public class PassportOffice
    {
        public int Id { get; set; }
        [Required]
        public TimeSpan OpenTime { get; set; }
        [Required]
        public TimeSpan CloseTime { get; set; }
    }

不需要转换器。它将按预期工作

gjmwrych

gjmwrych2#

为什么不做一个从TimeOnly到TimeSpan的转换器呢?

public class TimeOnlyConverter : ValueConverter<TimeOnly, TimeSpan>
{
    public TimeOnlyConverter() : base(
        d => d.ToTimeSpan(),
        d => TimeOnly.FromTimeSpan(d))
    { }
}

相关问题