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

如何在EF Core中将NpgsqlRange<DateTime>映射为tsrange而非默认tstzrange

如何配置Npgsql/EF以将NpgsqlRange<DateTime>映射为tsrange?

我有一个接受tsrange类型单个参数的UDF:

CREATE OR REPLACE FUNCTION data.my_test(value tsrange)
RETURNS TABLE ("column_a" tsrange) AS $$
BEGIN
    RETURN QUERY
    SELECT value;
END;
$$ LANGUAGE plpgsql;

我的DbContext的OnModelCreating方法按如下方式配置UDF调用:

modelBuilder.HasDbFunction(() => MyTest(default))
    .HasSchema("data")
    .HasName("my_test")
    .HasParameter("value", parameter => { parameter.Metadata.StoreType = @"tsrange"; });

调用该函数时出现以下错误:

MessageText: function data.my_test(tstzrange) does not exist

如果将my_test函数改为接受tstzrange参数,代码就能正常运行。

我无法确定如何配置Npgsql/EF以将NpgsqlRange<DateTime>映射为tsrange而非默认的tstzrange。

我已尝试的操作:

  • 配置全局类型映射:
    NpgsqlConnection.GlobalTypeMapper.MapComposite(typeof(NpgsqlRange<DateTime>), "tsrange");
    
  • 使用dataSourceBuilder配置类型映射:
    dataSourceBuilder.MapComposite<NpgsqlRange<DateTime>>("tsrange");
    
  • 传入UTC时间范围和未指定类型的时间范围。

看起来要实现此功能,需要在运行时模型中提供类型配置:

ITypeMappingConfiguration? IModel.FindTypeMappingConfiguration(Type propertyType)
    => _typeConfigurations.Count == 0
        ? null
        : _typeConfigurations.GetValueOrDefault(propertyType);

但我不知道该如何操作。

以下是我调用UDF的方式:

await using var dbContext = new MyDbContext();
var result = await dbContext.MyTest(new NpgsqlRange<DateTime>(DateTime.UtcNow, DateTime.UtcNow.AddDays(10)))
    .ToListAsync();

内容的提问来源于stack exchange,提问作者THX-1138

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:30:04