PostgreSQL映射枚举到jsonb字段时写入索引值,如何替换为枚举值?
PostgreSQL中EF Core将枚举映射到jsonb字段时,如何把存储的索引值替换为枚举字符串值?
当使用EF Core + Npgsql时,顶级枚举属性能正常映射为PostgreSQL枚举类型(底层存数值但交互用字符串),但嵌套在jsonb字段中的枚举默认会被序列化为数值索引。要改为存储枚举的字符串名称,只需配置JSON序列化器的枚举处理规则即可。
解决方案:配置JSON序列化器以字符串形式处理枚举
EF Core默认用System.Text.Json序列化jsonb字段,添加JsonStringEnumConverter就能让枚举序列化为字符串名称:
方式1:在DbContext的OnConfiguring中配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql("你的数据库连接字符串", o => o.UseJsonbOptions(new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } })); }
方式2:在服务注册时配置(Program.cs)
builder.Services.AddDbContext<YourDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"), npgsqlOptions => npgsqlOptions.UseJsonbOptions(new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } })));
若使用Newtonsoft.Json(Json.NET)
如果项目依赖Json.NET而非System.Text.Json,需额外安装对应Npgsql扩展包并配置:
- 安装扩展包:
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.JsonNet" Version="6.0.7" />
- 配置EF Core使用JsonNet,并设置全局枚举转换器:
// 在DbContext配置或服务注册中 optionsBuilder.UseNpgsql("你的数据库连接字符串", o => o.UseJsonNet()); // 设置全局Json序列化规则 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter() } };
保留原有枚举映射配置
你之前配置的以下代码无需修改,它们负责将顶级枚举映射为PostgreSQL数据库枚举类型:
// Program.cs NpgsqlConnection.GlobalTypeMapper.MapEnum<RowStatus>(); // DbContext OnModelCreating modelBuilder.HasPostgresEnum<RowStatus>();
修改后效果
配置完成后,jsonb字段中的枚举会被序列化为字符串名称,存储结果变为:
{ "RowStatus": "deleted" }
内容的提问来源于stack exchange,提问作者Mehmet Erdoğdu
相关产品推荐
相关产品推荐

