You need to enable JavaScript to run this app. EF Core + Pomelo 5.0查询MariaDB JSON列反序列化失败问题
优惠活动
大模型
产品
解决方案
定价
更多

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配置:
    数据注解写法:
    public class ValidateSaleInvoiceEntity
    {
        public int Id { get; set; }
        [Column(TypeName = "json")]
        public ValidateSaleInvoiceContent Content { get; set; }
    }
    
    Fluent API写法(在DbContext的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
);
  • 其他排查方向
    1. 检查嵌套的Address类是否也满足序列化要求:所有需要赋值的属性均为public set访问器,无自定义构造函数未声明无参构造的情况。
    2. 临时去掉查询中的AsNoTracking()测试,验证是否和选择的JSON变更跟踪选项存在兼容问题。
    3. 开启EF Core详细日志,捕获JSON列读取过程中被静默吃掉的反序列化异常,定位具体不匹配的字段。
    4. 确认使用的MariaDB版本,你指定的10.3.0版本对JSON类型的支持存在部分已知bug,建议升级到10.4及以上稳定版本测试。

内容的提问来源于stack exchange,提问作者C. Rozan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 08:27:08