FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

JsonMap失效

Open Zonciu opened this issue 8 months ago • 11 comments

问题描述及重现代码:

文档代码https://freesql.net/guide/type-mapping.html#json

fsql.UseJsonMap();

class Table
{
    public int Id { get; set; }

    [JsonMap]
    public TableOptions Options { get; set; }
}
class TableOptions
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
}

fsql.Select<Table>().Where(a => a.Options.Value1 == 100 && a.Options.Value2 == "xx").ToList();

异常:

Unhandled exception. System.Exception: FreeSql: Unable to parse expression: a.Options.Value1
   at FreeSql.Internal.CommonExpression.ExpressionLambdaToSql(Expression exp, ExpTSC tsc)
   at FreeSql.Internal.CommonExpression.ExpressionBinary(String oper, Expression leftExp, Expression rightExp, ExpTSC tsc)
   at FreeSql.Internal.CommonExpression.ExpressionLambdaToSql(Expression exp, ExpTSC tsc)
   at FreeSql.Internal.CommonExpression.ExpressionWhereLambda(List`1 _tables, Func`3 _tableRule, Expression exp, BaseDiyMemberExpression diymemexp, List`1 whereGlobalFilter, List`1 dbParams)
   at FreeSql.Internal.CommonProvider.Select0Provider`2.InternalWhere(Expression exp)
   at FreeSql.Internal.CommonProvider.Select1Provider`1.WhereIf(Boolean condition, Expression`1 exp)
   at FreeSql.Internal.CommonProvider.Select1Provider`1.Where(Expression`1 exp)

数据库版本

PostgreSQL 15.2, compiled by Visual C++ build 1914, 64-bit

安装的Nuget包

FreeSql.All 3.5.209 FreeSql.Extensions.JsonMap 3.5.209

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

.NET 9.0.301

Zonciu avatar Jul 06 '25 12:07 Zonciu

@2881099 我今天正好也碰到了 确实有这个问题

jakey188 avatar Jul 07 '25 08:07 jakey188

最近天气太热了,晚上看。

2881099 avatar Jul 08 '25 03:07 2881099

忘记 3.5.100 为啥去掉了 pgsql 几个数据库的 case 判断。已经恢复了,晚上发布新版本。

2881099 avatar Jul 09 '25 05:07 2881099

忘记 3.5.100 为啥去掉了 pgsql 几个数据库的 case 判断。已经恢复了,晚上发布新版本。

class Table
{
    public int Id { get; set; }

    [JsonMap, Column(DbType = "jsonb")]
    public TableOptions Options { get; set; }
}
class TableOptions
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
}

设置 Column(DbType = "jsonb")无效是否也一起恢复了

jakey188 avatar Jul 09 '25 06:07 jakey188

DbType = "jsonb" 无效是什么意思?

2881099 avatar Jul 09 '25 06:07 2881099

DbType = "jsonb" 无效是什么意思?

数据库里面的类型变成text了,而不是jsonb

jakey188 avatar Jul 09 '25 06:07 jakey188

pgsql 不再需要指定 DbType 了,之后一起发版

2881099 avatar Jul 09 '25 07:07 2881099

pgsql 不再需要指定 DbType 了,之后一起发版

class Table
{
    public int Id { get; set; }
    [JsonMap]
    public List<TableOptions> Options { get; set; }
    [JsonMap]
    public TableOptions Option { get; set; }
}
class TableOptions
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
}

当类型为集合的时候,会导致数据插入报错,这里交给用户指定会不会好一点

[JsonMap, Column(MapType =typeof(JArray))]或者[JsonMap, Column(DbType = "jsonb")]

现在更新SDK后会出现风险,会改变原有的字段类型,原来字段类型还是映射为text. 现在自动映射成了jsonb

jakey188 avatar Jul 10 '25 03:07 jakey188

@2881099 上面的情况不知道大佬是否有核实.

jakey188 avatar Jul 11 '25 09:07 jakey188

所以我之前在文档用 DbType = jsonb,可以自己指定。

如果不想改变这段类型,可以指定 MapType=string, StringLength=-1

2881099 avatar Jul 11 '25 15:07 2881099

所以我之前在文档用 DbType = jsonb,可以自己指定。

如果不想改变这段类型,可以指定 MapType=string, StringLength=-1

现在这样指定DbType = jsonb时,当类型为集合的时候,添加数据的时候会导致报错

必须[JsonMap, Column(MapType =typeof(JArray))]这样指定才行 @2881099

jakey188 avatar Jul 14 '25 01:07 jakey188