EF Core i enum w modelu postgresql

0

Hej, korzystam z .net 6, ef core, oraz bazy postgresql.

Próbuje zbudować model użytkownika, który będzie zawierał kolumnę AccountStatus, która będzie mogła przyjmować tylko 4 wartości (string).

[Required]
public AccountStatus AccountStatus { get; set; }

...

public enum AccountStatus
{
  Active,
  PendingApproval,
  Blocked,
  Limited
}

W moim Context mapuje tego enuma w następujący sposób:

static Context()
{
  NpgsqlConnection.GlobalTypeMapper.MapEnum<AccountStatus>();
}

...

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);

  modelBuilder.HasPostgresEnum<AccountStatus>();
}

Gdy w taki sposób, próbuje dodać obiekt do bazy (z AccountStatus = AccountStatus.PendingApproval) to otrzymuje błąd: column "AccountStatus" is of type account_status but expression is of type integer.

Próbowałem dokonać konwersji, jednakże ona w żaden sposób nie przynosi oczekiwanego rezultatu.

modelBuilder.Entity<User>().Property(x => x.AccountStatus).HasConversion(v => v.ToString(), v => (AccountStatus)Enum.Parse(typeof(AccountStatus), v));

column "AccountStatus" is of type account_status but expression is of type text

Miałby ktoś pomysł jak temu zaradzić? Możliwe jest, żeby wersja .net 6 była przyczyną?

1

Można dodać taki extension np:

public static class EfBuildersExtension
    {
        
        public static PropertyBuilder<TEnum> HasEnumToStringConversion<TEnum>(
            this PropertyBuilder<TEnum> propertyBuilder)
                where TEnum : struct
        {
            return propertyBuilder.HasConversion(new EnumToStringConverter<TEnum>());
        }
    }

a potem wołać to tak:

builder
                .Property(Encja => Encja.JakiśTypEnum)
                .IsRequired()
                .HasEnumToStringConversion();

Btw
Mnie osobiście nie podoba się trzymanie enuma jako string. Jak trzeba zmienić nazwę a dane są w bazie to przy pobieraniu będzie się sypać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1