EF Core + Pomelo 5.0查询MariaDB JSON列反序列化失败问题
问题根因及解决方案
导致反序列化失败的常见原因及修复方法如下:
- 实体属性访问权限问题
你定义的ValidateSaleInvoiceContent、ValidateSaleInvoiceLineEntity类中大部分属性的set访问器为internal,System.Text.Json(Microsoft JSON序列化器)默认仅支持反序列化到公共(public)setter,非公开访问器无法赋值,就会出现属性为默认空值的情况。
修复方法:将所有需要参与序列化/反序列化的属性set访问器改为public:
// 修改前 public DateTime Date { get; internal set; } // 修改后 public DateTime Date { get; set; }
- 未显式指定JSON列类型
Pomelo需要明确识别字段为JSON类型才会触发对应的序列化/反序列化逻辑,未显式标注的情况下可能被识别为普通字符串列,不会自动反序列化为POCO对象。
修复方法:给Content属性添加JSON类型标注,可以用数据注解或者Fluent API配置:
数据注解写法:
Fluent API写法(在DbContext的public class ValidateSaleInvoiceEntity { public int Id { get; set; } [Column(TypeName = "json")] public ValidateSaleInvoiceContent Content { get; set; } }OnModelCreating方法中配置):modelBuilder.Entity<ValidateSaleInvoiceEntity>() .Property(p => p.Content) .HasColumnType("json"); - System.Text.Json序列化配置不匹配
默认的System.Text.Json配置是大小写敏感的,如果数据库中存储的JSON键是驼峰命名、实体属性是帕斯卡命名,就会出现属性匹配失败无法赋值的情况,也可能存在日期格式、特殊字符处理不匹配的问题。
修复方法:在UseMicrosoftJson配置中传入自定义序列化选项,适配业务场景:
m.UseMicrosoftJson( new JsonSerializerOptions { // 开启属性名大小写不敏感匹配 PropertyNameCaseInsensitive = true, // 允许尾随逗号 AllowTrailingCommas = true, // 按需添加自定义转换器,比如枚举、日期格式转换器 Converters = { new JsonStringEnumConverter() } }, MySqlCommonJsonChangeTrackingOptions.FullHierarchyOptimizedSemantically );
- 其他排查方向
- 检查嵌套的
Address类是否也满足序列化要求:所有需要赋值的属性均为public set访问器,无自定义构造函数未声明无参构造的情况。 - 临时去掉查询中的
AsNoTracking()测试,验证是否和选择的JSON变更跟踪选项存在兼容问题。 - 开启EF Core详细日志,捕获JSON列读取过程中被静默吃掉的反序列化异常,定位具体不匹配的字段。
- 确认使用的MariaDB版本,你指定的10.3.0版本对JSON类型的支持存在部分已知bug,建议升级到10.4及以上稳定版本测试。
- 检查嵌套的
内容的提问来源于stack exchange,提问作者C. Rozan
相关产品推荐
相关产品推荐

