【问题标题】:How to map time(0) to TimeOnly Entity Framework SQL Server 2019?如何将时间(0)映射到 TimeOnly Entity Framework SQL Server 2019?
【发布时间】:2022-12-30 01:45:52
【问题描述】:

我正在尝试使用新的 TimeOnly 类型的 C#,但是当我进行迁移时,我遇到了以下问题。我正在使用 SQL Server 2019,错误是。

当前数据库提供程序不支持属性“PassportOffice.CloseTime”的类型“DateTime”。要么更改属性 CLR 类型,要么使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略该属性。

我用的是Entity Framework Core 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)");
}

我做错了吗?或者有没有其他方法可以解决问题?

【问题讨论】:

  • SQL Server time 数据类型直接映射到 CLR 类型 TimeSpan。也许这是解决问题的另一种方式。

标签: c# .net sql-server entity-framework


【解决方案1】:

实体框架映射 CLR 类型时间跨度SQL Server 类型为时间

如下更改模型定义

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

无需转换器。它会按预期工作

【讨论】:

    【解决方案2】:

    为什么不制作一个从 TimeOnly 到 TimeSpan 的转换器?

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

    【讨论】:

      【解决方案3】:

      我建议您查看我自己创建的支持这些数据类型的 AspNetCoreDateAndTimeOnly nuget 库 https://github.com/josegerar/AspNetCoreDateAndTimeOnly

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        相关资源
        最近更新 更多