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

EF Core 7 JSON数组列映射报错:类型不匹配问题求助

问题解决步骤

1. 确认EF Core版本

ToJson()是EF Core 7.0及以上才支持的特性,如果你使用的是更低版本,这个配置会失效,直接导致解析错误。请升级到EF Core 7+,或者改用下面的HasConversion兼容方案。

2. 检查数据库列类型与数据有效性

  • 确保Extras列的类型是数据库支持的JSON类型:
    • SQL Server:使用NVARCHAR(MAX)并添加JSON约束(执行ALTER TABLE LinerReceiptLog ADD CONSTRAINT CK_LinerReceiptLog_Extras_IsJson CHECK (ISJSON(Extras) = 1))
    • PostgreSQL:使用jsonb类型
  • 检查所有行的Extras值,确保都是有效的JSON数组,不存在单个JSON对象的情况(比如{"Key":"Part Number",...}这种格式会触发异常)。

3. 修正实体类与配置

方案一:继续使用OwnsMany + ToJson()(EF Core 7+)

确保Tag类是无主键的Owned Entity,ModelBuilder配置正确:

// Tag类定义
public class Tag
{
    public string Key { get; set; }
    // 兼容Value的多类型(int/string),用object或JsonElement均可
    public object Value { get; set; }
}

// LinerReceiptLog类定义
public class LinerReceiptLog
{
    public int Id { get; set; } // 你的主键字段
    public List<Tag> Extras { get; set; } = new List<Tag>();
}

// ModelBuilder配置
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<LinerReceiptLog>(entity =>
    {
        entity.OwnsMany(e => e.Extras, builder =>
        {
            builder.ToJson();
            // 可选:如果数据库列名和属性名一致可省略
            builder.ToJson("Extras");
        });
    });
}

方案二:使用HasConversion手动序列化(兼容所有EF Core版本)

如果OwnsMany方案仍报错,可直接通过类型转换处理JSON序列化:

// 实体类定义同上
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<LinerReceiptLog>(entity =>
    {
        entity.Property(e => e.Extras)
            .HasConversion(
                // 序列化:List<Tag>转JSON字符串
                v => JsonSerializer.Serialize(v, new JsonSerializerOptions { WriteIndented = false }),
                // 反序列化:JSON字符串转List<Tag>
                v => JsonSerializer.Deserialize<List<Tag>>(v, new JsonSerializerOptions()),
                // 配置值比较器,确保EF Core能正确识别集合变化
                new ValueComparer<List<Tag>>(
                    (c1, c2) => c1?.SequenceEqual(c2) ?? c2 is null,
                    c => c?.Aggregate(0, (hash, item) => HashCode.Combine(hash, item.Key.GetHashCode(), item.Value.GetHashCode())) ?? 0,
                    c => c?.ToList() ?? new List<Tag>()
                ))
            // 指定数据库列类型,SQL Server用NVARCHAR(MAX),PostgreSQL用jsonb
            .HasColumnType("NVARCHAR(MAX)")
            .HasColumnName("Extras");
    });
}

4. 验证查询

修改配置后,重新生成迁移并更新数据库,再执行查询即可解决异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:53:13