C# DateOnly类型在SQL Server 2019下无法完成EF Core迁移的问题咨询
结论
首先可以明确:DateOnly、TimeOnly类型的原生映射支持是EF Core 6.0及以上版本才提供的特性,你当前使用的EF Core 5.0.9版本不识别这两个新增的日期类型,因此会抛出属性无法映射的错误。
方案1:升级EF Core版本(推荐)
你的项目已经基于.NET 6运行,完全兼容EF Core 6.x版本,升级后可以直接原生支持DateOnly类型,无需额外配置:
- 把所有
Microsoft.EntityFrameworkCore开头的Nuget包统一升级到6.0.x稳定版 - 直接删除以下两个已经废弃的过时预览版包,EF Core 6已经将设计时功能整合到
Microsoft.EntityFrameworkCore.Design中,无需单独安装:Microsoft.EntityFrameworkCore.Relational.Design 2.0.0-preview1-finalMicrosoft.EntityFrameworkCore.SqlServer.Design 2.0.0-preview1-final
升级完成后执行迁移操作,EF Core会自动将DateOnly类型映射为SQL Server的date类型,完美适配你使用的SQL Server 2019。
方案2:不升级EF Core,手动配置值转换器
如果暂时无法升级EF Core版本,可以通过自定义值转换器实现DateOnly和数据库date类型的映射:
- 首先实现自定义转换器类
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime> { public DateOnlyConverter() : base( // 写入数据库时将DateOnly转为DateTime dateOnly => dateOnly.ToDateTime(TimeOnly.MinValue), // 从数据库读取时将DateTime转为DateOnly dateTime => DateOnly.FromDateTime(dateTime)) { } }
- 在DbContext的
OnModelCreating方法中为对应属性配置转换器
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Amenitie>() .Property(p => p.StartDate) .HasConversion<DateOnlyConverter>() .HasColumnType("date"); modelBuilder.Entity<Amenitie>() .Property(p => p.EndDate) .HasConversion<DateOnlyConverter>() .HasColumnType("date"); }
配置完成后即可正常执行迁移和数据读写操作。
额外注意
你当前的Nuget依赖中存在2.0预览版的设计类包,和你使用的5.0.9版本EF Core存在版本冲突风险,无论是否升级EF Core都建议先删除这两个过时包。
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

