Skip to content

Bug: InvalidCastException Converting Enums to Strings in Postgres  #388

@andreas-soroko

Description

@andreas-soroko

Database: Postgres

Hey,
when i try to save an enum as string, i getting this exception

System.InvalidCastException : Can't write CLR type TestModelEnum with handler type TextHandler
   at lambda_method(Closure , NpgsqlTypeHandler , Object , NpgsqlLengthCache& , NpgsqlParameter )
   at Npgsql.TypeHandling.NpgsqlTypeHandler`1.ValidateObjectAndGetLength(Object value, NpgsqlLengthCache& lengthCache, NpgsqlParameter parameter)
   at Npgsql.NpgsqlParameter.ValidateAndGetLength()
   at Npgsql.NpgsqlCommand.ValidateParameters(ConnectorTypeMapper typeMapper)
   at Npgsql.NpgsqlCommand.ExecuteReaderAsync(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteScalar(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteScalar()
   at RepoDb.DbConnectionExtension.InsertAsyncInternalBase[TEntity,TResult](IDbConnection connection, String tableName, TEntity entity, IEnumerable`1 fields, String hints, Nullable`1 commandTimeout, IDbTransaction transaction, ITrace trace, IStatementBuilder statementBuilder, Boolean skipIdentityCheck)
   at RepoDb.DbRepository`1.InsertAsync[TEntity](TEntity entity, String hints, IDbTransaction transaction)

first some working code

private enum TestModelEnum
{
    Test1,
    Test2
}
await using var connection = new NpgsqlConnection(_postgresDatabaseFixture.ConnectionString);
await connection.OpenAsync();
connection.TypeMapper.MapEnum<TestModelEnum>("enum_test");

await using var cmd = new NpgsqlCommand("INSERT INTO enum_test_table (id, pg_type) VALUES (@p1, @p2)", connection);
cmd.Parameters.Add(new NpgsqlParameter
{
    ParameterName = "p1",
    Value = Guid.NewGuid()
});
cmd.Parameters.Add(new NpgsqlParameter
{
    ParameterName = "p2",
    Value = TestModelEnum.Test1
});
cmd.ExecuteNonQuery();

not working

[Map("enum_test_table")]
private class TestModel
{
    [Primary, Map("id")]
    public Guid Id { get; set; }

    [Map("pg_Type"), TypeMap(DbType.String)]
    public TestModelEnum PgType { get; set; }
}

// in the static repository constructor
NpgsqlConnection.GlobalTypeMapper.MapEnum<TestModelEnum>("enum_test");

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdeployedFeature or bug is deployed at the current releasefixedThe bug, issue, incident has been fixed.todoThings to be done in the future

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions