-
Notifications
You must be signed in to change notification settings - Fork 3.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support HasConversion
to primitive collection types
#33688
Comments
@PascalArdex You should not need all the code you have when dealing with non-collections of enums. Instead, this should work: protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Properties<EquineBeast>().HaveConversion<string>();
} However, this is not yet supported for primitive collections--this is tracked by #31413. Instead you should be able to adapt the code you already have to configure the element type using this pattern: modelBuilder.Entity<Rider>().PrimitiveCollection(e => e.Mounts).ElementType().HasConversion<string>(); |
HasConversion
to primitive collection types
It works, thanks for your help. Here is the final code if anyone stumble into this private void SaveEnumAsString(ModelBuilder modelBuilder)
{
var entityTypes = modelBuilder.Model.GetEntityTypes();
foreach (var entityType in entityTypes)
{
var enumProperties = entityType.ClrType.GetProperties()
.Where(p => p.PropertyType.IsEnum
|| (p.PropertyType.IsGenericType
&& p.PropertyType.GetGenericTypeDefinition() == typeof(List<>)
&& p.PropertyType.GetGenericArguments()[0].IsEnum));
foreach (var enumProperty in enumProperties)
{
if(enumProperty.PropertyType.IsEnum)
{
modelBuilder
.Entity(entityType.ClrType)
.Property(enumProperty.Name)
.HasConversion<string>();
}
else
{
modelBuilder
.Entity(entityType.ClrType)
.PrimitiveCollection(enumProperty.Name)
.ElementType()
.HasConversion<string>();
}
}
}
} |
Description
In the Entities we use Enum types a lot and we make sure to store them as strings instead of numbers
For this we use
.HasConversion<string>();
and it works great.Now we would like to also support collections of Enums and have them serialized as text[] for consistency
And you would think this is a job for EF Core 8 Primitive Collections and we are going to be able to simply use
.HasConversion<string[]>();
but no luck.Example
Entity
I will include the full code because we configure all Enum based entities at once
OnModelCreating
Problem
Now here is the odd part.
When we create the migration EF Core is stuck with
int[]
We can force the column type with
.HasColumnType("text[]")
but it is creating more problems down the path.Namely the migration will apply but at runtime fails to load/convert the field
Version information
EF Core version: Microsoft.EntityFrameworkCore.Design 8.0.0
Database provider: Npgsql.EntityFrameworkCore.PostgreSQL 8.0.0
Target framework: net8.0
The text was updated successfully, but these errors were encountered: