如何在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
相关产品推荐
相关产品推荐

