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类型
- SQL Server:使用
- 检查所有行的
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
相关产品推荐
相关产品推荐

