FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

在使用JsonMap特性时,无法从数据库读取出数据

Open cps8 opened this issue 4 months ago • 3 comments

问题描述及重现代码:

背景:我有一个A类,和A1类,A1类重写了tostring\equals\gethashCode作为值对象类型 在A类中有个字段,类型为List<A1>,并标注了特性[JsonMap]。 通过文档 https://freesql.net/guide/type-mapping.html 尝试对A1 CURD 我做了如下尝试

  1. 数据库类型为 jsonb, C#字段不标注[Column(DbType="jsonb")] 结果无法添加
  2. 数据库类型为 jsonb,C#字段标注[Column(DbType="jsonb")] 结果无法添加
  3. 数据库类型为jsonb[], C#字段不标注dbtype 结果无法添加
  4. 数据库类型为text,C#字段标注[Column(MapType = typeof(string))] 可以正常添加 参考了issue dotnetcore/FreeSql/issues/2060 最终代码类似如下:
// c# code
public class A
{
  [Column(MapType=typeof(string))]
  [JsonMap]
  public List<A1> A1s{get; private set;}
}

public class A1
{
  public ulong Id {get; private set;}
  public int Num {get; private set;}
}

测试数据:仓储模式下 插入一条A并插入两条A1。 目前问题是: 在仓储模式下可以正常添加,select时获取到的数据A中 A1s为两条但是id和num均为0,与数据库数据不一致

数据库版本

pgsql V16.4

安装的Nuget包

FreeSql.Provider.PostgreSQL v3.5.212

.net framework/. net core? 及具体版本

.net 8

cps8 avatar Aug 30 '25 03:08 cps8

可能是因为private的原因

2881099 avatar Aug 30 '25 03:08 2881099

确实,经过测试,将A1中 private set 改为 set后,可以正确获取到数据库中的值,可是在A中不是只有这一个字段,其他字段也都是private set,同样可以从数据库中获取到数据。我认为可能是内置的JsonMap转换类只处理了public set

cps8 avatar Aug 30 '25 05:08 cps8

这个要看 JsonSetting,UseJsonMap 是不是有个参数?

2881099 avatar Aug 30 '25 09:08 2881099