You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-final
    • Microsoft.EntityFrameworkCore.SqlServer.Design 2.0.0-preview1-final

升级完成后执行迁移操作,EF Core会自动将DateOnly类型映射为SQL Server的date类型,完美适配你使用的SQL Server 2019。


方案2:不升级EF Core,手动配置值转换器

如果暂时无法升级EF Core版本,可以通过自定义值转换器实现DateOnly和数据库date类型的映射:

  1. 首先实现自定义转换器类
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime>
{
    public DateOnlyConverter() : base(
        // 写入数据库时将DateOnly转为DateTime
        dateOnly => dateOnly.ToDateTime(TimeOnly.MinValue),
        // 从数据库读取时将DateTime转为DateOnly
        dateTime => DateOnly.FromDateTime(dateTime))
    { }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:30:00