diff --git a/FreeSql.RESTful.Demo/Controllers/EntityController.cs b/Examples/FreeSql.RESTful.Demo/Controllers/EntityController.cs
similarity index 100%
rename from FreeSql.RESTful.Demo/Controllers/EntityController.cs
rename to Examples/FreeSql.RESTful.Demo/Controllers/EntityController.cs
diff --git a/Examples/FreeSql.RESTful.Demo/Entity/Song.cs b/Examples/FreeSql.RESTful.Demo/Entity/Song.cs
new file mode 100644
index 00000000..8b2b2f34
--- /dev/null
+++ b/Examples/FreeSql.RESTful.Demo/Entity/Song.cs
@@ -0,0 +1,10 @@
+using FreeSql.DataAnnotations;
+
+namespace FreeSql.RESTful.Demo.Entity {
+ public class Song {
+
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public string Title { get; set; }
+ }
+}
diff --git a/FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj b/Examples/FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj
similarity index 71%
rename from FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj
rename to Examples/FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj
index a52d3545..13b24f4a 100644
--- a/FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj
+++ b/Examples/FreeSql.RESTful.Demo/FreeSql.RESTful.Demo.csproj
@@ -7,15 +7,14 @@
-
-
-
+
+
diff --git a/FreeSql.RESTful.Demo/Program.cs b/Examples/FreeSql.RESTful.Demo/Program.cs
similarity index 100%
rename from FreeSql.RESTful.Demo/Program.cs
rename to Examples/FreeSql.RESTful.Demo/Program.cs
diff --git a/Examples/FreeSql.RESTful.Demo/Properties/launchSettings.json b/Examples/FreeSql.RESTful.Demo/Properties/launchSettings.json
new file mode 100644
index 00000000..06b7366a
--- /dev/null
+++ b/Examples/FreeSql.RESTful.Demo/Properties/launchSettings.json
@@ -0,0 +1,27 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:49778/",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "FreeSql.RESTful.Demo": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "http://localhost:49779/"
+ }
+ }
+}
\ No newline at end of file
diff --git a/FreeSql.RESTful.Demo/Startup.cs b/Examples/FreeSql.RESTful.Demo/Startup.cs
similarity index 83%
rename from FreeSql.RESTful.Demo/Startup.cs
rename to Examples/FreeSql.RESTful.Demo/Startup.cs
index 64b60821..cdc5b83f 100644
--- a/FreeSql.RESTful.Demo/Startup.cs
+++ b/Examples/FreeSql.RESTful.Demo/Startup.cs
@@ -1,22 +1,14 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.HttpsPolicy;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
using Swashbuckle.AspNetCore.Swagger;
+using System;
+using System.Text;
-namespace FreeSql.RESTful.Demo
-{
- public class Startup
+namespace FreeSql.RESTful.Demo {
+ public class Startup
{
public Startup(IConfiguration configuration, ILoggerFactory loggerFactory)
{
diff --git a/FreeSql.RESTful.Demo/appsettings.Development.json b/Examples/FreeSql.RESTful.Demo/appsettings.Development.json
similarity index 100%
rename from FreeSql.RESTful.Demo/appsettings.Development.json
rename to Examples/FreeSql.RESTful.Demo/appsettings.Development.json
diff --git a/FreeSql.RESTful.Demo/appsettings.json b/Examples/FreeSql.RESTful.Demo/appsettings.json
similarity index 100%
rename from FreeSql.RESTful.Demo/appsettings.json
rename to Examples/FreeSql.RESTful.Demo/appsettings.json
diff --git a/FreeSql.RESTful.Demo/xxxtb.db b/Examples/FreeSql.RESTful.Demo/xxxtb.db
similarity index 100%
rename from FreeSql.RESTful.Demo/xxxtb.db
rename to Examples/FreeSql.RESTful.Demo/xxxtb.db
diff --git a/FreeSql.Extensions.EFCoreModelBuilder/CodeFirstExtensions.cs b/FreeSql.Extensions.EFCoreModelBuilder/CodeFirstExtensions.cs
index a563e033..276097e1 100644
--- a/FreeSql.Extensions.EFCoreModelBuilder/CodeFirstExtensions.cs
+++ b/FreeSql.Extensions.EFCoreModelBuilder/CodeFirstExtensions.cs
@@ -1,64 +1,67 @@
-using Microsoft.EntityFrameworkCore;
+using FreeSql;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata;
using System;
using System.Linq;
-namespace FreeSql.Extensions.EFCoreModelBuilder {
+public static class FreeSqlExtensionsEFCoreModelBuilderCodeFirstExtensions {
- public static class CodeFirstExtensions {
+public static void ConfigEntity(this ICodeFirst codeFirst, IModel efmodel) {
- public static void ConfigEntity(this ICodeFirst codeFirst, ModelBuilder modelBuilder) {
+ foreach (var type in efmodel.GetEntityTypes()) {
- foreach (var type in modelBuilder.Model.GetEntityTypes()) {
+ codeFirst.ConfigEntity(type.ClrType, a => {
- codeFirst.ConfigEntity(type.ClrType, a => {
-
- //表名
- var relationalTableName = type.FindAnnotation("Relational:TableName");
- if (relationalTableName != null) {
- a.Name(relationalTableName.Value?.ToString() ?? type.ClrType.Name);
- }
-
- foreach (var prop in type.GetProperties()) {
-
- var freeProp = a.Property(prop.Name);
-
- //列名
- var relationalColumnName = prop.FindAnnotation("Relational:ColumnName");
- if (relationalColumnName != null) {
-
- freeProp.Name(relationalColumnName.Value?.ToString() ?? prop.Name);
- }
-
- //主键
- freeProp.IsPrimary(prop.IsPrimaryKey());
-
- //自增
- freeProp.IsIdentity(prop.GetAnnotations().Where(z =>
- z.Name == "SqlServer:ValueGenerationStrategy" && z.Value.ToString().Contains("IdentityColumn") //sqlserver 自增
- || z.Value.ToString().Contains("IdentityColumn") //其他数据库实现未经测试
- ).Any());
-
- //可空
- freeProp.IsNullable(prop.AfterSaveBehavior != Microsoft.EntityFrameworkCore.Metadata.PropertySaveBehavior.Throw);
-
- //类型
- var relationalColumnType = prop.FindAnnotation("Relational:ColumnType");
- if (relationalColumnType != null) {
-
- var dbType = relationalColumnType.ToString();
-
- if (!string.IsNullOrEmpty(dbType)) {
-
- var maxLength = prop.FindAnnotation("MaxLength");
- if (maxLength != null)
- dbType += $"({maxLength})";
-
- freeProp.DbType(dbType);
- }
- }
- }
- });
+ //表名
+ var relationalTableName = type.FindAnnotation("Relational:TableName");
+ if (relationalTableName != null) {
+ a.Name(relationalTableName.Value?.ToString() ?? type.ClrType.Name);
}
- }
+
+ foreach (var prop in type.GetProperties()) {
+
+ var freeProp = a.Property(prop.Name);
+
+ //列名
+ var relationalColumnName = prop.FindAnnotation("Relational:ColumnName");
+ if (relationalColumnName != null) {
+
+ freeProp.Name(relationalColumnName.Value?.ToString() ?? prop.Name);
+ }
+
+ //主键
+ freeProp.IsPrimary(prop.IsPrimaryKey());
+
+ //自增
+ freeProp.IsIdentity(
+ prop.ValueGenerated == ValueGenerated.Never ||
+ prop.ValueGenerated == ValueGenerated.OnAdd ||
+ prop.GetAnnotations().Where(z =>
+ z.Name == "SqlServer:ValueGenerationStrategy" && z.Value.ToString().Contains("IdentityColumn") //sqlserver 自增
+ || z.Value.ToString().Contains("IdentityColumn") //其他数据库实现未经测试
+ ).Any()
+ );
+
+ //可空
+ freeProp.IsNullable(prop.AfterSaveBehavior != PropertySaveBehavior.Throw);
+
+ //类型
+ var relationalColumnType = prop.FindAnnotation("Relational:ColumnType");
+ if (relationalColumnType != null) {
+
+ var dbType = relationalColumnType.ToString();
+
+ if (!string.IsNullOrEmpty(dbType)) {
+
+ var maxLength = prop.FindAnnotation("MaxLength");
+ if (maxLength != null)
+ dbType += $"({maxLength})";
+
+ freeProp.DbType(dbType);
+ }
+ }
+ }
+ });
}
}
+}
\ No newline at end of file
diff --git a/FreeSql.RESTful.Demo/Entity/Song.cs b/FreeSql.RESTful.Demo/Entity/Song.cs
deleted file mode 100644
index 817470de..00000000
--- a/FreeSql.RESTful.Demo/Entity/Song.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace FreeSql.RESTful.Demo.Entity {
- public class Song {
-
- public int Id { get; set; }
- public string Title { get; set; }
- }
-}
diff --git a/FreeSql.sln b/FreeSql.sln
index 198f1157..38d88e94 100644
--- a/FreeSql.sln
+++ b/FreeSql.sln
@@ -12,14 +12,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{C6A74E2A-6
readme.md = readme.md
EndProjectSection
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "xxx", "..\..\新建文件夹 (9)\xxx.csproj", "{6DC39740-0B26-4029-AB75-D436A7F666A2}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.PerformanceTests", "FreeSql.Tests.PerformanceTests\FreeSql.Tests.PerformanceTests.csproj", "{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.RESTful.Demo", "FreeSql.RESTful.Demo\FreeSql.RESTful.Demo.csproj", "{A749092B-4C21-4087-B33D-0FBD4DA51C24}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Extensions.EFCoreModelBuilder", "FreeSql.Extensions.EFCoreModelBuilder\FreeSql.Extensions.EFCoreModelBuilder.csproj", "{490CC8AF-C47C-4139-AED7-4FB6502F622B}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{94C8A78D-AA15-47B2-A348-530CD86BFC1B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.RESTful.Demo", "Examples\FreeSql.RESTful.Demo\FreeSql.RESTful.Demo.csproj", "{C32C7D4A-76D2-4A43-9A41-4B0440819954}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -54,18 +54,6 @@ Global
{AA88EB04-4788-4180-AE68-7FA5ED17D98C}.Release|x64.Build.0 = Release|Any CPU
{AA88EB04-4788-4180-AE68-7FA5ED17D98C}.Release|x86.ActiveCfg = Release|Any CPU
{AA88EB04-4788-4180-AE68-7FA5ED17D98C}.Release|x86.Build.0 = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|x64.Build.0 = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Debug|x86.Build.0 = Debug|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|Any CPU.Build.0 = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|x64.ActiveCfg = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|x64.Build.0 = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|x86.ActiveCfg = Release|Any CPU
- {6DC39740-0B26-4029-AB75-D436A7F666A2}.Release|x86.Build.0 = Release|Any CPU
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -78,18 +66,6 @@ Global
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Release|x64.Build.0 = Release|Any CPU
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Release|x86.ActiveCfg = Release|Any CPU
{446D9CBE-BFE4-4FB3-ADFD-4C1C5EA1B6EE}.Release|x86.Build.0 = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|x64.Build.0 = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Debug|x86.Build.0 = Debug|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|Any CPU.Build.0 = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|x64.ActiveCfg = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|x64.Build.0 = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|x86.ActiveCfg = Release|Any CPU
- {A749092B-4C21-4087-B33D-0FBD4DA51C24}.Release|x86.Build.0 = Release|Any CPU
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -102,10 +78,25 @@ Global
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Release|x64.Build.0 = Release|Any CPU
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Release|x86.ActiveCfg = Release|Any CPU
{490CC8AF-C47C-4139-AED7-4FB6502F622B}.Release|x86.Build.0 = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|x64.Build.0 = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Debug|x86.Build.0 = Debug|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|x64.ActiveCfg = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|x64.Build.0 = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|x86.ActiveCfg = Release|Any CPU
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {C32C7D4A-76D2-4A43-9A41-4B0440819954} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B}
+ EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
EndGlobalSection
diff --git a/FreeSql/Extensions/FreeSqlStringExtensions.cs b/FreeSql/Extensions/FreeSqlStringExtensions.cs
index b28aea29..e3186bd2 100644
--- a/FreeSql/Extensions/FreeSqlStringExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlStringExtensions.cs
@@ -41,7 +41,3 @@
public static string FormatSqlite (this string that, params object[] args) => _sqliteAdo.Addslashes(that, args);
static FreeSql.Sqlite.SqliteAdo _sqliteAdo = new FreeSql.Sqlite.SqliteAdo();
}
-
-namespace System.Runtime.CompilerServices {
- public class ExtensionAttribute : Attribute { }
-}
\ No newline at end of file
diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs
index 7be2acd4..e3e326b8 100644
--- a/FreeSql/Internal/CommonUtils.cs
+++ b/FreeSql/Internal/CommonUtils.cs
@@ -34,16 +34,20 @@ namespace FreeSql.Internal {
ConcurrentDictionary dicConfigEntity = new ConcurrentDictionary();
internal ICodeFirst ConfigEntity(Action> entity) {
+ if (entity == null) return _orm.CodeFirst;
var type = typeof(T);
var table = dicConfigEntity.GetOrAdd(type, new TableAttribute());
var fluent = new TableFluent(table);
- entity?.Invoke(fluent);
+ entity.Invoke(fluent);
+ Utils.GetTableByEntity(type, this, true); //update cache
return _orm.CodeFirst;
}
internal ICodeFirst ConfigEntity(Type type, Action entity) {
+ if (entity == null) return _orm.CodeFirst;
var table = dicConfigEntity.GetOrAdd(type, new TableAttribute());
var fluent = new TableFluent(type, table);
- entity?.Invoke(fluent);
+ entity.Invoke(fluent);
+ Utils.GetTableByEntity(type, this, true); //update cache
return _orm.CodeFirst;
}
internal TableAttribute GetEntityTableAttribute(Type type) {
diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs
index 559ad436..a0cd0afc 100644
--- a/FreeSql/Internal/UtilsExpressionTree.cs
+++ b/FreeSql/Internal/UtilsExpressionTree.cs
@@ -24,10 +24,10 @@ namespace FreeSql.Internal {
class Utils {
static ConcurrentDictionary> _cacheGetTableByEntity = new ConcurrentDictionary>();
- internal static TableInfo GetTableByEntity(Type entity, CommonUtils common) {
+ internal static TableInfo GetTableByEntity(Type entity, CommonUtils common, bool isReCache = false) {
if (entity.FullName.StartsWith("<>f__AnonymousType")) return null;
var tbc = _cacheGetTableByEntity.GetOrAdd(common.DbName, k1 => new ConcurrentDictionary()); //区分数据库类型缓存
- if (tbc.TryGetValue(entity, out var trytb)) return trytb;
+ if (isReCache == false && tbc.TryGetValue(entity, out var trytb)) return trytb;
if (common.CodeFirst.GetDbInfo(entity) != null) return null;
var tbattr = common.GetEntityTableAttribute(entity);
@@ -105,7 +105,7 @@ namespace FreeSql.Internal {
foreach (var col in trytb.Primarys)
col.Attribute.IsPrimary = true;
}
- tbc.TryAdd(entity, trytb);
+ tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb);
#region virtual 属性延时加载,动态产生新的重写类
if (common.CodeFirst.IsLazyLoading && propsLazy.Any()) {
diff --git a/FreeSql/Internal/UtilsReflection.cs b/FreeSql/Internal/UtilsReflection.cs
index e90de4bf..26d36a59 100644
--- a/FreeSql/Internal/UtilsReflection.cs
+++ b/FreeSql/Internal/UtilsReflection.cs
@@ -1,280 +1,280 @@
-using FreeSql.DataAnnotations;
-using FreeSql.Internal.Model;
-using Newtonsoft.Json.Linq;
-using Npgsql.LegacyPostgis;
-using NpgsqlTypes;
-using System;
-using System.Collections;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Net;
-using System.Net.NetworkInformation;
-using System.Reflection;
-using System.Text.RegularExpressions;
-using System.Threading;
+//using FreeSql.DataAnnotations;
+//using FreeSql.Internal.Model;
+//using Newtonsoft.Json.Linq;
+//using Npgsql.LegacyPostgis;
+//using NpgsqlTypes;
+//using System;
+//using System.Collections;
+//using System.Collections.Concurrent;
+//using System.Collections.Generic;
+//using System.Diagnostics;
+//using System.Linq;
+//using System.Net;
+//using System.Net.NetworkInformation;
+//using System.Reflection;
+//using System.Text.RegularExpressions;
+//using System.Threading;
-namespace FreeSql.Internal {
- class UtilsReflection {
+//namespace FreeSql.Internal {
+// class UtilsReflection {
- static ConcurrentDictionary _cacheGetTableByEntity = new ConcurrentDictionary();
- internal static TableInfo GetTableByEntity(Type entity, CommonUtils common) {
- if (entity.FullName.StartsWith("<>f__AnonymousType")) return null;
- if (_cacheGetTableByEntity.TryGetValue($"{common.DbName}-{entity.FullName}", out var trytb)) return trytb; //区分数据库类型缓存
- if (common.CodeFirst.GetDbInfo(entity) != null) return null;
+// static ConcurrentDictionary _cacheGetTableByEntity = new ConcurrentDictionary();
+// internal static TableInfo GetTableByEntity(Type entity, CommonUtils common) {
+// if (entity.FullName.StartsWith("<>f__AnonymousType")) return null;
+// if (_cacheGetTableByEntity.TryGetValue($"{common.DbName}-{entity.FullName}", out var trytb)) return trytb; //区分数据库类型缓存
+// if (common.CodeFirst.GetDbInfo(entity) != null) return null;
- var tbattr = entity.GetCustomAttributes(typeof(TableAttribute), false).LastOrDefault() as TableAttribute;
- trytb = new TableInfo();
- trytb.Type = entity;
- trytb.Properties = entity.GetProperties().ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase);
- trytb.CsName = entity.Name;
- trytb.DbName = (tbattr?.Name ?? entity.Name);
- trytb.DbOldName = tbattr?.OldName;
- if (common.CodeFirst.IsSyncStructureToLower) {
- trytb.DbName = trytb.DbName.ToLower();
- trytb.DbOldName = trytb.DbOldName?.ToLower();
- }
- trytb.SelectFilter = tbattr?.SelectFilter;
- foreach (var p in trytb.Properties.Values) {
- var tp = common.CodeFirst.GetDbInfo(p.PropertyType);
- //if (tp == null) continue;
- var colattr = p.GetCustomAttributes(typeof(ColumnAttribute), false).LastOrDefault() as ColumnAttribute;
- if (tp == null && colattr == null) continue;
- if (colattr == null)
- colattr = new ColumnAttribute {
- Name = p.Name,
- DbType = tp.Value.dbtypeFull,
- IsIdentity = false,
- IsNullable = tp.Value.isnullable ?? true,
- IsPrimary = false,
- };
- if (string.IsNullOrEmpty(colattr.DbType)) colattr.DbType = tp?.dbtypeFull ?? "varchar(255)";
- colattr.DbType = colattr.DbType.ToUpper();
+// var tbattr = entity.GetCustomAttributes(typeof(TableAttribute), false).LastOrDefault() as TableAttribute;
+// trytb = new TableInfo();
+// trytb.Type = entity;
+// trytb.Properties = entity.GetProperties().ToDictionary(a => a.Name, a => a, StringComparer.CurrentCultureIgnoreCase);
+// trytb.CsName = entity.Name;
+// trytb.DbName = (tbattr?.Name ?? entity.Name);
+// trytb.DbOldName = tbattr?.OldName;
+// if (common.CodeFirst.IsSyncStructureToLower) {
+// trytb.DbName = trytb.DbName.ToLower();
+// trytb.DbOldName = trytb.DbOldName?.ToLower();
+// }
+// trytb.SelectFilter = tbattr?.SelectFilter;
+// foreach (var p in trytb.Properties.Values) {
+// var tp = common.CodeFirst.GetDbInfo(p.PropertyType);
+// //if (tp == null) continue;
+// var colattr = p.GetCustomAttributes(typeof(ColumnAttribute), false).LastOrDefault() as ColumnAttribute;
+// if (tp == null && colattr == null) continue;
+// if (colattr == null)
+// colattr = new ColumnAttribute {
+// Name = p.Name,
+// DbType = tp.Value.dbtypeFull,
+// IsIdentity = false,
+// IsNullable = tp.Value.isnullable ?? true,
+// IsPrimary = false,
+// };
+// if (string.IsNullOrEmpty(colattr.DbType)) colattr.DbType = tp?.dbtypeFull ?? "varchar(255)";
+// colattr.DbType = colattr.DbType.ToUpper();
- if (tp != null && tp.Value.isnullable == null) colattr.IsNullable = tp.Value.dbtypeFull.Contains("NOT NULL") == false;
- if (colattr.DbType?.Contains("NOT NULL") == true) colattr.IsNullable = false;
- if (string.IsNullOrEmpty(colattr.Name)) colattr.Name = p.Name;
- if (common.CodeFirst.IsSyncStructureToLower) colattr.Name = colattr.Name.ToLower();
+// if (tp != null && tp.Value.isnullable == null) colattr.IsNullable = tp.Value.dbtypeFull.Contains("NOT NULL") == false;
+// if (colattr.DbType?.Contains("NOT NULL") == true) colattr.IsNullable = false;
+// if (string.IsNullOrEmpty(colattr.Name)) colattr.Name = p.Name;
+// if (common.CodeFirst.IsSyncStructureToLower) colattr.Name = colattr.Name.ToLower();
- if ((colattr.IsNullable != true || colattr.IsIdentity == true || colattr.IsPrimary == true) && colattr.DbType.Contains("NOT NULL") == false) {
- colattr.IsNullable = false;
- colattr.DbType += " NOT NULL";
- }
- if (colattr.IsNullable == true && colattr.DbType.Contains("NOT NULL")) colattr.DbType = colattr.DbType.Replace("NOT NULL", "");
- colattr.DbType = Regex.Replace(colattr.DbType, @"\([^\)]+\)", m => {
- var tmpLt = Regex.Replace(m.Groups[0].Value, @"\s", "");
- if (tmpLt.Contains("CHAR")) tmpLt = tmpLt.Replace("CHAR", " CHAR");
- if (tmpLt.Contains("BYTE")) tmpLt = tmpLt.Replace("BYTE", " BYTE");
- return tmpLt;
- });
- colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(Activator.CreateInstance(trytb.Type));
- if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue;
- if (colattr.IsNullable == false && colattr.DbDefautValue == null)
- colattr.DbDefautValue = Activator.CreateInstance(p.PropertyType.IsNullableType() ? p.PropertyType.GenericTypeArguments.FirstOrDefault() : p.PropertyType);
+// if ((colattr.IsNullable != true || colattr.IsIdentity == true || colattr.IsPrimary == true) && colattr.DbType.Contains("NOT NULL") == false) {
+// colattr.IsNullable = false;
+// colattr.DbType += " NOT NULL";
+// }
+// if (colattr.IsNullable == true && colattr.DbType.Contains("NOT NULL")) colattr.DbType = colattr.DbType.Replace("NOT NULL", "");
+// colattr.DbType = Regex.Replace(colattr.DbType, @"\([^\)]+\)", m => {
+// var tmpLt = Regex.Replace(m.Groups[0].Value, @"\s", "");
+// if (tmpLt.Contains("CHAR")) tmpLt = tmpLt.Replace("CHAR", " CHAR");
+// if (tmpLt.Contains("BYTE")) tmpLt = tmpLt.Replace("BYTE", " BYTE");
+// return tmpLt;
+// });
+// colattr.DbDefautValue = trytb.Properties[p.Name].GetValue(Activator.CreateInstance(trytb.Type));
+// if (colattr.DbDefautValue == null) colattr.DbDefautValue = tp?.defaultValue;
+// if (colattr.IsNullable == false && colattr.DbDefautValue == null)
+// colattr.DbDefautValue = Activator.CreateInstance(p.PropertyType.IsNullableType() ? p.PropertyType.GenericTypeArguments.FirstOrDefault() : p.PropertyType);
- var col = new ColumnInfo {
- Table = trytb,
- CsName = p.Name,
- CsType = p.PropertyType,
- Attribute = colattr
- };
- trytb.Columns.Add(colattr.Name, col);
- trytb.ColumnsByCs.Add(p.Name, col);
- }
- trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsPrimary == true).ToArray();
- if (trytb.Primarys.Any() == false) {
- trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsIdentity == true).ToArray();
- foreach(var col in trytb.Primarys)
- col.Attribute.IsPrimary = true;
- }
- _cacheGetTableByEntity.TryAdd(entity.FullName, trytb);
- return trytb;
- }
+// var col = new ColumnInfo {
+// Table = trytb,
+// CsName = p.Name,
+// CsType = p.PropertyType,
+// Attribute = colattr
+// };
+// trytb.Columns.Add(colattr.Name, col);
+// trytb.ColumnsByCs.Add(p.Name, col);
+// }
+// trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsPrimary == true).ToArray();
+// if (trytb.Primarys.Any() == false) {
+// trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsIdentity == true).ToArray();
+// foreach(var col in trytb.Primarys)
+// col.Attribute.IsPrimary = true;
+// }
+// _cacheGetTableByEntity.TryAdd(entity.FullName, trytb);
+// return trytb;
+// }
- internal static T[] GetDbParamtersByObject(string sql, object obj, string paramPrefix, Func constructorParamter) {
- if (string.IsNullOrEmpty(sql) || obj == null) return new T[0];
- var ttype = typeof(T);
- var type = obj.GetType();
- if (type == ttype) return new[] { (T)Convert.ChangeType(obj, type) };
- var ret = new List();
- var ps = type.GetProperties();
- foreach (var p in ps) {
- if (sql.IndexOf($"{paramPrefix}{p.Name}", StringComparison.CurrentCultureIgnoreCase) == -1) continue;
- var pvalue = p.GetValue(obj);
- if (p.PropertyType == ttype) ret.Add((T)Convert.ChangeType(pvalue, ttype));
- else ret.Add(constructorParamter(p.Name, p.PropertyType, pvalue));
- }
- return ret.ToArray();
- }
+// internal static T[] GetDbParamtersByObject(string sql, object obj, string paramPrefix, Func constructorParamter) {
+// if (string.IsNullOrEmpty(sql) || obj == null) return new T[0];
+// var ttype = typeof(T);
+// var type = obj.GetType();
+// if (type == ttype) return new[] { (T)Convert.ChangeType(obj, type) };
+// var ret = new List();
+// var ps = type.GetProperties();
+// foreach (var p in ps) {
+// if (sql.IndexOf($"{paramPrefix}{p.Name}", StringComparison.CurrentCultureIgnoreCase) == -1) continue;
+// var pvalue = p.GetValue(obj);
+// if (p.PropertyType == ttype) ret.Add((T)Convert.ChangeType(pvalue, ttype));
+// else ret.Add(constructorParamter(p.Name, p.PropertyType, pvalue));
+// }
+// return ret.ToArray();
+// }
- static Dictionary dicExecuteArrayRowReadClassOrTuple = new Dictionary {
- [typeof(bool)] = true,
- [typeof(sbyte)] = true,
- [typeof(short)] = true,
- [typeof(int)] = true,
- [typeof(long)] = true,
- [typeof(byte)] = true,
- [typeof(ushort)] = true,
- [typeof(uint)] = true,
- [typeof(ulong)] = true,
- [typeof(double)] = true,
- [typeof(float)] = true,
- [typeof(decimal)] = true,
- [typeof(TimeSpan)] = true,
- [typeof(DateTime)] = true,
- [typeof(DateTimeOffset)] = true,
- [typeof(byte[])] = true,
- [typeof(string)] = true,
- [typeof(Guid)] = true,
- [typeof(MygisPoint)] = true,
- [typeof(MygisLineString)] = true,
- [typeof(MygisPolygon)] = true,
- [typeof(MygisMultiPoint)] = true,
- [typeof(MygisMultiLineString)] = true,
- [typeof(MygisMultiPolygon)] = true,
- [typeof(BitArray)] = true,
- [typeof(NpgsqlPoint)] = true,
- [typeof(NpgsqlLine)] = true,
- [typeof(NpgsqlLSeg)] = true,
- [typeof(NpgsqlBox)] = true,
- [typeof(NpgsqlPath)] = true,
- [typeof(NpgsqlPolygon)] = true,
- [typeof(NpgsqlCircle)] = true,
- [typeof((IPAddress Address, int Subnet))] = true,
- [typeof(IPAddress)] = true,
- [typeof(PhysicalAddress)] = true,
- [typeof(NpgsqlRange)] = true,
- [typeof(NpgsqlRange)] = true,
- [typeof(NpgsqlRange)] = true,
- [typeof(NpgsqlRange)] = true,
- [typeof(PostgisPoint)] = true,
- [typeof(PostgisLineString)] = true,
- [typeof(PostgisPolygon)] = true,
- [typeof(PostgisMultiPoint)] = true,
- [typeof(PostgisMultiLineString)] = true,
- [typeof(PostgisMultiPolygon)] = true,
- [typeof(PostgisGeometry)] = true,
- [typeof(PostgisGeometryCollection)] = true,
- [typeof(Dictionary)] = true,
- [typeof(JToken)] = true,
- [typeof(JObject)] = true,
- [typeof(JArray)] = true,
- };
+// static Dictionary dicExecuteArrayRowReadClassOrTuple = new Dictionary {
+// [typeof(bool)] = true,
+// [typeof(sbyte)] = true,
+// [typeof(short)] = true,
+// [typeof(int)] = true,
+// [typeof(long)] = true,
+// [typeof(byte)] = true,
+// [typeof(ushort)] = true,
+// [typeof(uint)] = true,
+// [typeof(ulong)] = true,
+// [typeof(double)] = true,
+// [typeof(float)] = true,
+// [typeof(decimal)] = true,
+// [typeof(TimeSpan)] = true,
+// [typeof(DateTime)] = true,
+// [typeof(DateTimeOffset)] = true,
+// [typeof(byte[])] = true,
+// [typeof(string)] = true,
+// [typeof(Guid)] = true,
+// [typeof(MygisPoint)] = true,
+// [typeof(MygisLineString)] = true,
+// [typeof(MygisPolygon)] = true,
+// [typeof(MygisMultiPoint)] = true,
+// [typeof(MygisMultiLineString)] = true,
+// [typeof(MygisMultiPolygon)] = true,
+// [typeof(BitArray)] = true,
+// [typeof(NpgsqlPoint)] = true,
+// [typeof(NpgsqlLine)] = true,
+// [typeof(NpgsqlLSeg)] = true,
+// [typeof(NpgsqlBox)] = true,
+// [typeof(NpgsqlPath)] = true,
+// [typeof(NpgsqlPolygon)] = true,
+// [typeof(NpgsqlCircle)] = true,
+// [typeof((IPAddress Address, int Subnet))] = true,
+// [typeof(IPAddress)] = true,
+// [typeof(PhysicalAddress)] = true,
+// [typeof(NpgsqlRange)] = true,
+// [typeof(NpgsqlRange)] = true,
+// [typeof(NpgsqlRange)] = true,
+// [typeof(NpgsqlRange)] = true,
+// [typeof(PostgisPoint)] = true,
+// [typeof(PostgisLineString)] = true,
+// [typeof(PostgisPolygon)] = true,
+// [typeof(PostgisMultiPoint)] = true,
+// [typeof(PostgisMultiLineString)] = true,
+// [typeof(PostgisMultiPolygon)] = true,
+// [typeof(PostgisGeometry)] = true,
+// [typeof(PostgisGeometryCollection)] = true,
+// [typeof(Dictionary)] = true,
+// [typeof(JToken)] = true,
+// [typeof(JObject)] = true,
+// [typeof(JArray)] = true,
+// };
- internal static ConcurrentDictionary _dicClassConstructor = new ConcurrentDictionary();
- internal static ConcurrentDictionary _dicTupleConstructor = new ConcurrentDictionary();
- internal class _dicClassConstructorInfo {
- public ConstructorInfo Constructor { get; set; }
- public PropertyInfo[] Properties { get; set; }
- }
- internal class _dicTupleConstructorInfo {
- public ConstructorInfo Constructor { get; set; }
- public Type[] Types { get; set; }
- }
- internal static (object value, int dataIndex) ExecuteArrayRowReadClassOrTuple(Type type, Dictionary names, object[] row, int dataIndex = 0) {
- if (type.IsArray) return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
- var typeGeneric = type;
- if (typeGeneric.IsNullableType()) typeGeneric = type.GenericTypeArguments.First();
- if (typeGeneric.IsEnum ||
- dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric))
- return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
- if (type.Namespace == "System" && (type.FullName == "System.String" || type.IsValueType)) { //值类型,或者元组
- bool isTuple = type.Name.StartsWith("ValueTuple`");
- if (isTuple) {
- if (_dicTupleConstructor.TryGetValue(type, out var tupleInfo) == false) {
- var types = type.GetFields().Select(a => a.FieldType).ToArray();
- tupleInfo = new _dicTupleConstructorInfo { Constructor = type.GetConstructor(types), Types = types };
- _dicTupleConstructor.AddOrUpdate(type, tupleInfo, (t2, c2) => tupleInfo);
- }
- var parms = new object[tupleInfo.Types.Length];
- for (int a = 0; a < parms.Length; a++) {
- var read = ExecuteArrayRowReadClassOrTuple(tupleInfo.Types[a], names, row, dataIndex);
- if (read.dataIndex > dataIndex) dataIndex = read.dataIndex;
- parms[a] = read.value;
- }
- return (tupleInfo.Constructor?.Invoke(parms), dataIndex);
- }
- return (dataIndex >= row.Length || (row[dataIndex] ?? DBNull.Value) == DBNull.Value ? null : GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
- }
- if (type == typeof(object) && names != null) {
- dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写
- var expandodic = (IDictionary)expando;
- foreach (var name in names)
- expandodic.Add(name.Key, row[name.Value]);
- return (expando, names.Count);
- }
- //类注入属性
- if (_dicClassConstructor.TryGetValue(type, out var classInfo)== false) {
- classInfo = new _dicClassConstructorInfo { Constructor = type.GetConstructor(new Type[0]), Properties = type.GetProperties() };
- _dicClassConstructor.TryAdd(type, classInfo);
- }
- var value = classInfo.Constructor.Invoke(new object[0]);
- foreach(var prop in classInfo.Properties) {
- var tryidx = dataIndex;
- if (names != null && names.TryGetValue(prop.Name, out tryidx) == false) continue;
- var read = ExecuteArrayRowReadClassOrTuple(prop.PropertyType, names, row, tryidx);
- if (read.dataIndex > dataIndex) dataIndex = read.dataIndex;
- prop.SetValue(value, read.value, null);
- //FillPropertyValue(value, p.Name, read.value);
- //p.SetValue(value, read.value);
- }
- return (value, dataIndex);
- }
+// internal static ConcurrentDictionary _dicClassConstructor = new ConcurrentDictionary();
+// internal static ConcurrentDictionary _dicTupleConstructor = new ConcurrentDictionary();
+// internal class _dicClassConstructorInfo {
+// public ConstructorInfo Constructor { get; set; }
+// public PropertyInfo[] Properties { get; set; }
+// }
+// internal class _dicTupleConstructorInfo {
+// public ConstructorInfo Constructor { get; set; }
+// public Type[] Types { get; set; }
+// }
+// internal static (object value, int dataIndex) ExecuteArrayRowReadClassOrTuple(Type type, Dictionary names, object[] row, int dataIndex = 0) {
+// if (type.IsArray) return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
+// var typeGeneric = type;
+// if (typeGeneric.IsNullableType()) typeGeneric = type.GenericTypeArguments.First();
+// if (typeGeneric.IsEnum ||
+// dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric))
+// return (GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
+// if (type.Namespace == "System" && (type.FullName == "System.String" || type.IsValueType)) { //值类型,或者元组
+// bool isTuple = type.Name.StartsWith("ValueTuple`");
+// if (isTuple) {
+// if (_dicTupleConstructor.TryGetValue(type, out var tupleInfo) == false) {
+// var types = type.GetFields().Select(a => a.FieldType).ToArray();
+// tupleInfo = new _dicTupleConstructorInfo { Constructor = type.GetConstructor(types), Types = types };
+// _dicTupleConstructor.AddOrUpdate(type, tupleInfo, (t2, c2) => tupleInfo);
+// }
+// var parms = new object[tupleInfo.Types.Length];
+// for (int a = 0; a < parms.Length; a++) {
+// var read = ExecuteArrayRowReadClassOrTuple(tupleInfo.Types[a], names, row, dataIndex);
+// if (read.dataIndex > dataIndex) dataIndex = read.dataIndex;
+// parms[a] = read.value;
+// }
+// return (tupleInfo.Constructor?.Invoke(parms), dataIndex);
+// }
+// return (dataIndex >= row.Length || (row[dataIndex] ?? DBNull.Value) == DBNull.Value ? null : GetDataReaderValue(type, row[dataIndex]), dataIndex + 1);
+// }
+// if (type == typeof(object) && names != null) {
+// dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写
+// var expandodic = (IDictionary)expando;
+// foreach (var name in names)
+// expandodic.Add(name.Key, row[name.Value]);
+// return (expando, names.Count);
+// }
+// //类注入属性
+// if (_dicClassConstructor.TryGetValue(type, out var classInfo)== false) {
+// classInfo = new _dicClassConstructorInfo { Constructor = type.GetConstructor(new Type[0]), Properties = type.GetProperties() };
+// _dicClassConstructor.TryAdd(type, classInfo);
+// }
+// var value = classInfo.Constructor.Invoke(new object[0]);
+// foreach(var prop in classInfo.Properties) {
+// var tryidx = dataIndex;
+// if (names != null && names.TryGetValue(prop.Name, out tryidx) == false) continue;
+// var read = ExecuteArrayRowReadClassOrTuple(prop.PropertyType, names, row, tryidx);
+// if (read.dataIndex > dataIndex) dataIndex = read.dataIndex;
+// prop.SetValue(value, read.value, null);
+// //FillPropertyValue(value, p.Name, read.value);
+// //p.SetValue(value, read.value);
+// }
+// return (value, dataIndex);
+// }
- internal static void FillPropertyValue(object info, string memberAccessPath, object value) {
- var current = info;
- PropertyInfo prop = null;
- var members = memberAccessPath.Split('.');
- for (var a = 0; a < members.Length; a++) {
- var type = current.GetType();
- prop = type.GetProperty(members[a], BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
- if (prop == null) throw new Exception(string.Concat(type.FullName, " 没有定义属性 ", members[a]));
- if (a < members.Length - 1) current = prop.GetValue(current);
- }
- prop.SetValue(current, GetDataReaderValue(prop.PropertyType, value), null);
- }
- internal static object GetDataReaderValue(Type type, object value) {
- if (value == null || value == DBNull.Value) return null;
- if (type.FullName == "System.Byte[]") return value;
- if (type.IsArray) {
- var elementType = type.GetElementType();
- var valueArr = value as Array;
- if (elementType == valueArr.GetType().GetElementType()) return value;
- var len = valueArr.GetLength(0);
- var ret = Array.CreateInstance(elementType, len);
- for (var a = 0; a < len; a++) {
- var item = valueArr.GetValue(a);
- ret.SetValue(GetDataReaderValue(elementType, item), a);
- }
- return ret;
- }
- if (type.IsNullableType()) type = type.GenericTypeArguments.First();
- if (type.IsEnum) return Enum.Parse(type, string.Concat(value), true);
- switch(type.FullName) {
- case "System.Guid":
- if (value.GetType() != type) return Guid.TryParse(string.Concat(value), out var tryguid) ? tryguid : Guid.Empty;
- return value;
- case "MygisPoint": return MygisPoint.Parse(string.Concat(value)) as MygisPoint;
- case "MygisLineString": return MygisLineString.Parse(string.Concat(value)) as MygisLineString;
- case "MygisPolygon": return MygisPolygon.Parse(string.Concat(value)) as MygisPolygon;
- case "MygisMultiPoint": return MygisMultiPoint.Parse(string.Concat(value)) as MygisMultiPoint;
- case "MygisMultiLineString": return MygisMultiLineString.Parse(string.Concat(value)) as MygisMultiLineString;
- case "MygisMultiPolygon": return MygisMultiPolygon.Parse(string.Concat(value)) as MygisMultiPolygon;
- case "Newtonsoft.Json.Linq.JToken": return JToken.Parse(string.Concat(value));
- case "Newtonsoft.Json.Linq.JObject": return JObject.Parse(string.Concat(value));
- case "Newtonsoft.Json.Linq.JArray": return JArray.Parse(string.Concat(value));
- case "Npgsql.LegacyPostgis.PostgisGeometry": return value;
- }
- if (type != value.GetType()) {
- if (type.FullName == "System.TimeSpan") return TimeSpan.FromSeconds(double.Parse(value.ToString()));
- return Convert.ChangeType(value, type);
- }
- return value;
- }
- internal static string GetCsName(string name) {
- name = Regex.Replace(name.TrimStart('@'), @"[^\w]", "_");
- return char.IsLetter(name, 0) ? name : string.Concat("_", name);
- }
- }
-}
\ No newline at end of file
+// internal static void FillPropertyValue(object info, string memberAccessPath, object value) {
+// var current = info;
+// PropertyInfo prop = null;
+// var members = memberAccessPath.Split('.');
+// for (var a = 0; a < members.Length; a++) {
+// var type = current.GetType();
+// prop = type.GetProperty(members[a], BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
+// if (prop == null) throw new Exception(string.Concat(type.FullName, " 没有定义属性 ", members[a]));
+// if (a < members.Length - 1) current = prop.GetValue(current);
+// }
+// prop.SetValue(current, GetDataReaderValue(prop.PropertyType, value), null);
+// }
+// internal static object GetDataReaderValue(Type type, object value) {
+// if (value == null || value == DBNull.Value) return null;
+// if (type.FullName == "System.Byte[]") return value;
+// if (type.IsArray) {
+// var elementType = type.GetElementType();
+// var valueArr = value as Array;
+// if (elementType == valueArr.GetType().GetElementType()) return value;
+// var len = valueArr.GetLength(0);
+// var ret = Array.CreateInstance(elementType, len);
+// for (var a = 0; a < len; a++) {
+// var item = valueArr.GetValue(a);
+// ret.SetValue(GetDataReaderValue(elementType, item), a);
+// }
+// return ret;
+// }
+// if (type.IsNullableType()) type = type.GenericTypeArguments.First();
+// if (type.IsEnum) return Enum.Parse(type, string.Concat(value), true);
+// switch(type.FullName) {
+// case "System.Guid":
+// if (value.GetType() != type) return Guid.TryParse(string.Concat(value), out var tryguid) ? tryguid : Guid.Empty;
+// return value;
+// case "MygisPoint": return MygisPoint.Parse(string.Concat(value)) as MygisPoint;
+// case "MygisLineString": return MygisLineString.Parse(string.Concat(value)) as MygisLineString;
+// case "MygisPolygon": return MygisPolygon.Parse(string.Concat(value)) as MygisPolygon;
+// case "MygisMultiPoint": return MygisMultiPoint.Parse(string.Concat(value)) as MygisMultiPoint;
+// case "MygisMultiLineString": return MygisMultiLineString.Parse(string.Concat(value)) as MygisMultiLineString;
+// case "MygisMultiPolygon": return MygisMultiPolygon.Parse(string.Concat(value)) as MygisMultiPolygon;
+// case "Newtonsoft.Json.Linq.JToken": return JToken.Parse(string.Concat(value));
+// case "Newtonsoft.Json.Linq.JObject": return JObject.Parse(string.Concat(value));
+// case "Newtonsoft.Json.Linq.JArray": return JArray.Parse(string.Concat(value));
+// case "Npgsql.LegacyPostgis.PostgisGeometry": return value;
+// }
+// if (type != value.GetType()) {
+// if (type.FullName == "System.TimeSpan") return TimeSpan.FromSeconds(double.Parse(value.ToString()));
+// return Convert.ChangeType(value, type);
+// }
+// return value;
+// }
+// internal static string GetCsName(string name) {
+// name = Regex.Replace(name.TrimStart('@'), @"[^\w]", "_");
+// return char.IsLetter(name, 0) ? name : string.Concat("_", name);
+// }
+// }
+//}
\ No newline at end of file
diff --git a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs
index ae16d021..43ea23b0 100644
--- a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs
+++ b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs
@@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace FreeSql.Oracle {
- public class OracleConnectionPool : ObjectPool {
+ class OracleConnectionPool : ObjectPool {
internal Action availableHandler;
internal Action unavailableHandler;
@@ -49,7 +49,7 @@ namespace FreeSql.Oracle {
}
}
- public class OracleConnectionPoolPolicy : IPolicy {
+ class OracleConnectionPoolPolicy : IPolicy {
internal OracleConnectionPool _pool;
public string Name { get; set; } = "Oracle Connection 对象池";
diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs
index c0e1d7fd..f47f935f 100644
--- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs
+++ b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs
@@ -11,7 +11,7 @@ using System.Threading.Tasks;
namespace FreeSql.PostgreSQL {
- public class PostgreSQLConnectionPool : ObjectPool {
+ class PostgreSQLConnectionPool : ObjectPool {
internal Action availableHandler;
internal Action unavailableHandler;
@@ -44,7 +44,7 @@ namespace FreeSql.PostgreSQL {
}
}
- public class PostgreSQLConnectionPoolPolicy : IPolicy {
+ class PostgreSQLConnectionPoolPolicy : IPolicy {
internal PostgreSQLConnectionPool _pool;
public string Name { get; set; } = "PostgreSQL NpgsqlConnection 对象池";