Skip to content

Mapping issues with schema-scoped enums #554

@austindrenski

Description

@austindrenski

Enum mapping works as advertised given a CLR enum (SomeEnum) and an equivalent PostgreSQL enum (some_enum):

static SomeDbContext()
{  
    // works as advertised for public.some_enum
    NpgsqlConnection.GlobalTypeMapper.MapEnum<SomeEnum>();
}

However, if some_enum is created in some_schema rather than the public schema, the normal mapping behavior does not work:

static SomeDbContext()
{  
    // does *not* work for some_schema.some_enum
    NpgsqlConnection.GlobalTypeMapper.MapEnum<SomeEnum>();
}

Instead, an explicit schema-qualified name needs to be provided:

static SomeDbContext()
{  
    // does work for some_schema.some_enum
    NpgsqlConnection.GlobalTypeMapper.MapEnum<SomeEnum>("some_schema.some_enum");
}

This behavior makes sense to a certain extent, but it would be nice if the default schema confgured for the DbContext could be detected and used for enum mapping:

protected override void OnModelCreating(ModelBuilder builder)
        => builder.HasDefaultSchema("some_schema");

CREATE SCHEMA test;

CREATE TYPE mapped_enum AS ENUM ('happy', 'sad');

CREATE TYPE test.manual_enum AS ENUM ('happy', 'sad');

CREATE TABLE some_table (
  id int,
  mapped_enum mapped_enum,
  manual_enum test.manual_enum
);
public class SomeTable
{
    public int Id { get; set; }

    public MappedEnum MappedEnum { get; set; }

    public ManualEnum ManualEnum { get; set; }
}

public class EnumContext : DbContext
{
    public DbSet<SomeTable> SomeTable { get; set; }

    static EnumContext()
    {
        NpgsqlConnection.GlobalTypeMapper.MapEnum<MappedEnum>();
        NpgsqlConnection.GlobalTypeMapper.MapEnum<ManualEnum>();
    }

    public EnumContext(DbContextOptions options) : base(options) {}

    protected override void OnModelCreating(ModelBuilder builder)
        => builder.ForNpgsqlHasEnum("mapped_enum", new[] { "happy", "sad" })
                  .HasDefaultSchema("test");
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions