You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core 6中POCO类映射JSONB列失败,求解决方案

EF Core 6 中映射POCO到JSONB列的解决方案

执行add-migration "AddWeek"时抛出异常:
属性“WeekData.Week”无法映射到数据库类型“JSONB”,因为数据库提供程序不支持将“Week”属性映射到“JSONB”列。

解决方案

1. 确认数据库依赖与提供器

JSONB是PostgreSQL专属类型,需安装对应版本的EF Core提供器包,确保版本与EF Core 6匹配:

Install-Package Npgsql.EntityFrameworkCore.PostgreSQL -Version 6.*

2. 配置DbContext使用PostgreSQL提供器

在DbContext的OnConfiguring方法中指定使用Npgsql提供器:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseNpgsql("你的PostgreSQL连接字符串");
}

3. 两种映射配置方式

方式一:使用Npgsql内置JSONB转换(推荐)

Npgsql提供了简化方法,自动处理序列化、反序列化及值比较逻辑:

public void Configure(EntityTypeBuilder<WeekData> builder)
{
    builder.Property(jc => jc.Week)
        .HasColumnName("week")
        .HasJsonbConversion();
}

方式二:自定义值转换器(通用适配)

若需自定义序列化规则,可手动配置转换器与值比较器:

using System.Text.Json;

public void Configure(EntityTypeBuilder<WeekData> builder)
{
    var jsonOptions = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        IgnoreNullValues = true
    };

    builder.Property(jc => jc.Week)
        .HasColumnName("week")
        .HasColumnType("jsonb")
        .HasConversion(
            week => JsonSerializer.Serialize(week, jsonOptions),
            json => JsonSerializer.Deserialize<Week>(json, jsonOptions)
        )
        .Metadata.SetValueComparer(new ValueComparer<Week>(
            (a, b) => JsonSerializer.Serialize(a, jsonOptions) == JsonSerializer.Serialize(b, jsonOptions),
            week => JsonSerializer.Serialize(week, jsonOptions).GetHashCode(),
            week => JsonSerializer.Deserialize<Week>(JsonSerializer.Serialize(week, jsonOptions), jsonOptions)
        ));
}

4. 重新执行迁移

完成配置后,重新运行迁移命令:

add-migration "AddWeek"
update-database

内容的提问来源于stack exchange,提问作者Manoj Soma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:23:21