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

EF Core配置UseNodaTime后无法识别NodaTime.Duration类型问题

问题根源

  1. 你当前使用的3.1.3版本Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime未内置NodaTime.Duration到PostgreSQL interval类型的映射支持,该支持是在5.0及以上版本才正式加入的,所以首次生成迁移时会抛出类型不支持的错误。
  2. 自定义转换器后插入报错的原因:调用.UseNodaTime()后,Npgsql会将PostgreSQL interval类型的默认CLR绑定类型修改为NodaTime.Duration,对应的IntervalHandler仅接收Duration类型的值,你通过转换器转为TimeSpan后类型不匹配,就会抛出类型转换异常。

解决方法

方案1:适配当前3.1版本依赖,无需升级包

保留你写的转换器,额外为属性指定提供程序层面的CLR类型为TimeSpan即可,修改实体配置代码如下:

public class TestEntityConfiguration : IEntityTypeConfiguration<TestEntity>
{
    public void Configure(EntityTypeBuilder<TestEntity> builder)
    {
        builder.Property(e => e.Duration)
            .HasConversion(
                duration => duration.ToTimeSpan(),
                timeSpan => Duration.FromTimeSpan(timeSpan)
            )
            .HasColumnType("interval")
            // 显式指定provider层面处理的类型为TimeSpan,绕过NodaTime的IntervalHandler
            .Metadata.SetProviderClrType(typeof(TimeSpan));
    }
}

修改后重新生成迁移、更新数据库即可正常插入查询。


方案2:升级Npgsql相关依赖包(推荐)

将所有Npgsql开头的Nuget包升级到5.0.x及以上兼容.NET Core 3.1的版本,升级后不需要写任何自定义转换器,框架原生支持NodaTime.Duration到PostgreSQL interval的映射,生成迁移和数据操作都不会报错。


内容的提问来源于stack exchange,提问作者user606521

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:48:02