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

使用Postgres和EF Core通过ValueConverter过滤DateOnly?时遇异常

问题

在Postgres数据库中有一张带日期字段的表,使用EF Core对该字段添加Where条件查询时,为DateOnly?类型的DateCol字段配置ValueConverter后,查询无法正常执行。

代码示例

modelBuilder.Entity<Table>()
            .Property(p => p.DateCol)
            .HasConversion(new ValueConverter<DateOnly?, DateOnly?>(v => v, v => v));

var c = new DBContext();
var l = new List<DateOnly?>() { new Nullable<DateOnly>(new DateOnly(1982, 10, 14)) };
var y = c.Table.Where(u => l.Contains(u.DateCol)).ToList();

抛出异常

MissingMethodException: Constructor on type 'Microsoft.EntityFrameworkCore.Storage.Json.JsonCollectionOfNullableStructsReaderWriter2[[System.Collections.Generic.List1[[System.Nullable`1[[System.DateOnly, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.DateOnly, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' not found.

原因分析
  • 你添加的ValueConverter<DateOnly?, DateOnly?>是无意义的转换器(输入输出类型完全一致),但它覆盖了EF Core默认的DateOnly?类型映射逻辑。
  • 执行Contains查询时,EF Core需要将List<DateOnly?>序列化为JSON参数传递给Postgres,但因为自定义了转换器,EF Core尝试使用JsonCollectionOfNullableStructsReaderWriter处理该集合类型,而该类型的构造器无法匹配当前的泛型参数组合,导致抛出MissingMethodException。
  • EF Core 7及以上版本已经内置了DateOnly?类型的映射支持,完全不需要手动添加这种冗余转换器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:38:10