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
.net 7+ 版本
// Call UseNodaTime() when building your data source:
var dataSourceBuilder = new NpgsqlDataSourceBuilder(/* connection string */);
dataSourceBuilder.MapEnum<Mood>();
var dataSource = dataSourceBuilder.Build();
builder.Services.AddDbContext<MyContext>(options => options.UseNpgsql(dataSource));