我尝试使用新的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)");
}
是我弄错了吗?还是有别的办法解决这个问题?
2条答案
按热度按时间lnlaulya1#
实体框架将CLR类型TimeSpanSQL Server类型Map到时间
按如下所示更改模型定义
不需要转换器。它将按预期工作
gjmwrych2#
为什么不做一个从TimeOnly到TimeSpan的转换器呢?