【发布时间】: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