Uso Dapper y PostgreSQL en mi proyecto. Y tengo algunas enumeraciones personalizadas, compuestos y tipos de rango en mi esquema, por ejemplo:
create type timerange as range ( subtype = time, subtype_diff = time_subtype_diff );Y uso este rango en la tabla myproject.working_time_intervals, que está conectado con la clase modelo WorkingInterval:
create table working_time_intervals ( id serial not null constraint working_time_intervals_pk primary key, day_of_week myproject.day_of_week not null, begin_end_range myproject.timerange ); public class WorkingInterval { public int Id { get; set; } public DayOfWeek DayOfWeek { get; set; } public NpgsqlRange<TimeSpan> BeginEndRange { get; set; } }Además, cuando trato de usar esta clase e insertar datos en db y obtener resultados, obtengo una excepción
var result = await connection.QueryAsync<WorkingInterval>( @"insert into myproject.working_time_intervals(day_of_week, begin_end_range) select unnest(@DayOfWeeks), myproject.timerange(unnest(@Begins)::time, unnest(@Ends)::time, '[]') returning *", new { DayOfWeeks = intervals.Select(i => i.DayOfWeek).ToArray(), Begins = intervals.Select(i => i.Begin).ToArray(), Ends = intervals.Select(i => i.End).ToArray() }); 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.¿Cómo puedo crear un mapeo para el rango de tiempo?
El problema aquí es que .NET TimeSpan no está asignado de manera predeterminada al time de PostgreSQL; está asignado al interval ( consulte la tabla de documentos sobre asignaciones ); esto significa que NpgsqlRange<TimeSpan> tampoco se asigna a su timerange de tiempo de PostgreSQL de forma predeterminada.
Todavía es posible que todo esto funcione, pero debe decirle a Npgsql explícitamente qué tipo enviar. Sin usar Dapper, lo siguiente debería funcionar bien:
cmd = new NpgsqlCommand(@"INSERT INTO foo (range) VALUES (@range)", conn); cmd.Parameters.AddWithValue("range", NpgsqlDbType.Range | NpgsqlDbType.Time, new NpgsqlRange<TimeSpan>(TimeSpan.FromHours(1), TimeSpan.FromHours(2))); cmd.ExecuteNonQuery(); cmd = new NpgsqlCommand(@"INSERT INTO foo (ranges) VALUES (@ranges)", conn); cmd.Parameters.AddWithValue("ranges", NpgsqlDbType.Range | NpgsqlDbType.Array | NpgsqlDbType.Time, new[] { new NpgsqlRange<TimeSpan>(TimeSpan.FromHours(1), TimeSpan.FromHours(2)), new NpgsqlRange<TimeSpan>(TimeSpan.FromHours(3), TimeSpan.FromHours(4)) }); cmd.ExecuteNonQuery();Con Dapper, necesitará un poco de personalización para configurar NpgsqlDbType,esta pregunta debería ayudar .