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
相关产品推荐
相关产品推荐

