Postgresql在将enum映射到jsonb字段时写入索引值。我如何用枚举值替换它?
默认情况下,模型中的任何枚举属性都将映射到数据库整数。EF Core 2.1还允许您使用值转换器将这些映射到数据库中的字符串。
然而,Npgsql提供程序还允许您将CLR枚举映射到数据库枚举类型。这个选项是PostgreSQL独有的,它提供了两全其美的优点:枚举在数据库内部以数字的形式存储(最小的存储空间),但像字符串一样处理(更可用,不需要记住数值),并且具有类型安全。
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.7" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
public class Company : BaseEntity
{
public string Name { get; set; }
[Column(TypeName = "jsonb")]
public CompanyJsonData Json { get; set; }
public RowStatus Status { get; set; } //this work
}
public class CompanyJsonData
{
public string Tag { get; set; }
public RowStatus Status { get; set; } //this does not work
}
// Program.cs
NpgsqlConnection.GlobalTypeMapper.MapEnum<RowStatus>();
// :DbContext OnModelCreating method
modelBuilder.HasPostgresEnum<RowStatus>();
public enum RowStatus
{
active = 1,
passive = 2,
deleted = 3
}
当前:
{
"RowStatus": 3
}
必须:
{
"RowStatus": "deleted"
}
你应该添加dbcontext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresEnum<RowStatus>();
}
在program.cs
NpgsqlConnection.GlobalTypeMapper.MapEnum<RowStatus>();
之后添加并应用迁移
文档https://www.npgsql.org/efcore/mapping/enum.html?tabs=tabid-1