Skip to content

Can't write arrays of user-defined ranges #3137

@NazarPolevyi

Description

@NazarPolevyi

Steps to reproduce

Hi, after Npgsql.EntityFrameworkCore.PostgreSQL update from to 7.0.4 to 8.0.2. We have started to receive an exception when saving into db.
InvalidCastException: Writing values of 'NpgsqlTypes.NpgsqlRange`1[[System.TimeSpan, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]][]' is not supported for parameters having NpgsqlDbType '-2147483608'.


public class RestrictionSettings
{
    [Column("id")]
    public Guid Id { get; set; }

    [Column("allowed_time_ranges", TypeName = "timerange[]")]
    public NpgsqlRange<TimeSpan>[]? AllowedTimeRanges { get; set; }
}

private readonly NpgsqlDataSource _dataSource;
private readonly ILoggerFactory _loggerFactory;

public class CustomDbContext : DbContext
{
    private readonly NpgsqlDataSource _dataSource;
    private readonly ILoggerFactory _loggerFactory;

    public CustomDbContext (NpgsqlDataSource dataSource, ILoggerFactory loggerFactory)
    {
        _dataSource = dataSource;
        _loggerFactory = loggerFactory;
    }

    public DbSet<RestrictionSettings> RestrictionSettings{ get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
      if (!optionsBuilder.IsConfigured)
      {
          optionsBuilder
              .UseLoggerFactory(_loggerFactory)
              .UseNpgsql(
                  _dataSource,
                  o => o
                      .SetPostgresVersion(new Version(10, 21))
                      .MapRange<TimeSpan>("timerange", subtypeName: "time without time zone"));

          optionsBuilder
              .EnableDetailedErrors()
              .EnableSensitiveDataLogging();
      }
  }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
     modelBuilder.HasPostgresRange(name: "timerange", subtype: "time without time zone");
  }
}

Registration example

  services.AddSingleton<Func<CustomDbContext>>(p => () =>
      {
          var connectionString = "connection string";

          var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString);
          dataSourceBuilder.EnableDynamicJson().EnableUnmappedTypes();
          var dataSource = dataSourceBuilder.Build();

          return new CustomDbContext (
              dataSource,
              p.GetRequiredService<ILoggerFactory>());
      });

The timerange it's a custom timerange type:

` CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS
'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;

CREATE TYPE timerange AS RANGE (
    subtype = time without time zone,
    subtype_diff = time_subtype_diff
);`

How can we solve this error? Before update it was working,

Exception message:
`Microsoft.EntityFrameworkCore.DbUpdateException
  HResult=0x80131500
  Message=An error occurred while saving the entity changes. See the inner exception for details.
  Source=Microsoft.EntityFrameworkCore.Relational
  StackTrace:
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.<ExecuteAsync>d__50.MoveNext()
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.<ExecuteAsync>d__9.MoveNext()
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.<ExecuteAsync>d__9.MoveNext()
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.<ExecuteAsync>d__9.MoveNext()
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__111.MoveNext()
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__115.MoveNext()
   at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.<ExecuteAsync>d__7`2.MoveNext()
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__63.MoveNext()
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__63.MoveNext()
   at 

  This exception was originally thrown at this call stack:
    [External Code]
Inner Exception 1:
InvalidCastException: Writing values of 'NpgsqlTypes.NpgsqlRange`1[[System.TimeSpan, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]][]' is not supported for parameters having NpgsqlDbType '-2147483608'.
`

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions