Postgresql jsonb 枚举映射

问题描述 投票:0回答:2

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"
}
.net postgresql entity-framework-core npgsql
2个回答
1
投票

你应该添加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


0
投票

.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));
© www.soinside.com 2019 - 2024. All rights reserved.