diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index bdd16ff9..da7ace6b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -538,14 +538,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
index 96d17f87..4428e136 100644
--- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
+++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
@@ -14,6 +14,16 @@
编号
+
+
+ 会员ID
+
+
+
+
+ 会员ID
+
+
收款金额
diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs
new file mode 100644
index 00000000..ba5b9681
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Issues/1092.cs
@@ -0,0 +1,66 @@
+using FreeSql.DataAnnotations;
+using FreeSql;
+using System;
+using System.Collections.Generic;
+using Xunit;
+using System.Linq;
+using Newtonsoft.Json.Linq;
+using NpgsqlTypes;
+using Npgsql.LegacyPostgis;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+using System.ComponentModel.DataAnnotations;
+using System.Threading;
+using System.Data.SqlClient;
+using kwlib;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace FreeSql.Tests.Issues
+{
+ public class _1092
+ {
+ [Fact]
+ public void JsonbTest()
+ {
+ var fsql = g.pgsql;
+ fsql.Delete().Where("1=1").ExecuteAffrows();
+
+ var model = new Test() { Name = "hahahah", Ids = new List { 22 } };
+
+ var json1 = JsonConvert.SerializeObject(new List { 22 });
+ var jarray1 = JArray.FromObject(new List { 22 });
+
+ //异常:
+ /*
+ * Unable to cast object of type 'Newtonsoft.Json.Linq.JArray' to type 'System.String'.”
+ */
+ var insertAndOut = fsql.Insert(model)
+ .ExecuteInserted();
+
+ //异常,和ExecuteInserted一样的错误
+ var updateResult = fsql.Update()
+ .SetSource(model)
+ .ExecuteUpdated();
+ }
+
+ [Table(Name = "public.test_issues_1092")]
+ public class Test
+ {
+ [Column(Name = "id", IsPrimary = true, IsIdentity = true)]
+ public int Id { get; set; }
+ ///
+ /// 会员ID
+ ///
+ [Column(Name = "name")]
+ public string Name { get; set; }
+ ///
+ /// 会员ID
+ ///
+ [Column(Name = "ids", MapType = typeof(JArray))]
+ public List Ids { get; set; }
+ }
+ }
+}
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
index 95df5ad2..3570378a 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
@@ -12,6 +12,7 @@ using System.Data.Common;
using System.Linq.Expressions;
using System.Net;
using System.Net.NetworkInformation;
+using System.Reflection;
using System.Threading;
namespace FreeSql.PostgreSQL
@@ -70,6 +71,7 @@ namespace FreeSql.PostgreSQL
var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) });
var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) });
var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) });
+ var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null);
Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) =>
{
switch (type.FullName)
@@ -95,7 +97,10 @@ namespace FreeSql.PostgreSQL
return Expression.Return(returnTarget, valueExp);
}
if (typeof(IList).IsAssignableFrom(type))
- return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type));
+ return Expression.IfThenElse(
+ Expression.TypeIs(valueExp, typeof(string)),
+ Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)),
+ Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type)));
return null;
});
}