C# 如何为自定义Postgresql范围类型创建类型映射?

C# 如何为自定义Postgresql范围类型创建类型映射?,c#,.net,postgresql,dapper,npgsql,C#,.net,Postgresql,Dapper,Npgsql,我在项目中使用Dapper和PostgreSQL。我的模式中有一些自定义枚举、复合和范围类型,例如: 将类型时间范围创建为范围( 子类型=时间, 子类型_diff=时间_子类型_diff ); 我在表myproject.working\u time\u Interval中使用这个范围,它与模型类WorkingInterval连接: 创建工作时间间隔表 ( 序列号不为空 限制工作时间间隔 主键, 周中的日myproject.周中的日不为空, 开始\结束\范围myproject.timerange

我在项目中使用Dapper和PostgreSQL。我的模式中有一些自定义枚举、复合和范围类型,例如:

将类型时间范围创建为范围(
子类型=时间,
子类型_diff=时间_子类型_diff
);
我在表myproject.working\u time\u Interval中使用这个范围,它与模型类WorkingInterval连接:

创建工作时间间隔表
(
序列号不为空
限制工作时间间隔
主键,
周中的日myproject.周中的日不为空,
开始\结束\范围myproject.timerange
);
public class WorkingInterval
{
公共int Id{get;set;}
公共DayOfWeek DayOfWeek{get;set;}
公共NpgsqlRange BeginEndRange{get;set;}
}
另外,当我尝试使用这个类并在db中插入数据并得到结果时,我捕获异常

var result=await connection.QueryAsync(
@“插入到myproject中。工作时间间隔(周中的天、开始和结束范围)
选择unnest(@DayOfWeeks),myproject.timerange(unnest(@Begins)::time,unnest(@Ends)::time,“[]”)
返回*“,
新的
{
DayOfWeeks=间隔。选择(i=>i.DayOfWeek.ToArray(),
开始=间隔。选择(i=>i.Begin).ToArray(),
结束=间隔。选择(i=>i.End).ToArray()
});

如何为时间范围创建映射?

这里的问题是.NET TimeSpan默认情况下不映射到PostgreSQL
time
-它映射到
interval
();这意味着默认情况下,
NpgsqlRange
也不会映射到PostgreSQL
timerange

所有这些仍然可以工作,但您需要明确地告诉Npgsql要发送哪种类型。在不使用Dapper的情况下,以下各项应能很好地发挥作用:

cmd=newnpgsqlcommand(@“插入到foo(范围)值(@range)”,conn);
cmd.Parameters.AddWithValue(“range”,NpgsqlDbType.range | NpgsqlDbType.Time,新的NpgsqlRange(TimeSpan.FromHours(1),TimeSpan.FromHours(2));
cmd.ExecuteNonQuery();
cmd=新的NpgsqlCommand(@“插入到foo(范围)值(@ranges)”,conn);
cmd.Parameters.AddWithValue(“ranges”,NpgsqlDbType.Range | NpgsqlDbType.Array | NpgsqlDbType.Time,新[]
{
新的NpgsqlRange(TimeSpan.FromHours(1)、TimeSpan.FromHours(2)),
新的NpgsqlRange(时间跨度从小时(3)开始,时间跨度从小时(4))
});
cmd.ExecuteNonQuery();

使用Dapper,您需要进行一些定制来设置NpgsqlDbType。

您不需要像映射枚举和组合那样映射范围类型(全局或其他),因为它们总是映射到NPGSQLDBRANGE而不是您自己的类型。错误消息是关于TimeSpan,在您的onconfiguration中,您可以看到其中指定了float。你能发布一个复制错误的最小代码示例吗?谢谢回复。对不起,解释不清楚。我重写了它
System.NotSupportedException: The CLR array type NpgsqlTypes.NpgsqlRange`1[System.TimeSpan][] isn't supported by Npgsql or your PostgreSQL. If you wish to map it to an  PostgreSQL composite type array you need to register it before usage, please refer to the documentation.\r\n   at Npgsql.TypeMapping.ConnectorTypeMapper.GetByClrType(Type type)\r\n   at Npgsql.