使用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.JsonCollectionOfNullableStructsReaderWriter
2[[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

