From 50a8cc23765a6ed491ff73713bac397c0f290bb0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 30 Aug 2021 12:26:30 +0800 Subject: [PATCH] - fix #815 --- .../FreeSql.Extensions.BaseEntity.xml | 87 +++++++-- .../FreeSql.Extensions.JsonMap.xml | 4 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 + FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 2 + FreeSql/FreeSql.xml | 183 ------------------ .../SelectProvider/Select0Provider.cs | 16 +- 6 files changed, 97 insertions(+), 204 deletions(-) diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.xml b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.xml index 8b44d128..254706c1 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.xml +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.xml @@ -6,8 +6,12 @@ + Entity base class, including CreateTime/UpdateTime/IsDeleted, the CRUD methods, and ID primary key definition. + 包括 CreateTime/UpdateTime/IsDeleted、CRUD 方法、以及 ID 主键定义 的实体基类 + When TKey is int/long, the Id is set to be an auto-incremented primary key + 当 TKey 为 int/long 时,Id 主键被设为自增值主键 @@ -15,11 +19,13 @@ + Primary key
主键
+ Get data based on the value of the primary key
根据主键值获取数据
@@ -27,6 +33,7 @@
+ Get data based on the value of the primary key
根据主键值获取数据
@@ -34,50 +41,62 @@
+ Entity base class, including CreateTime/UpdateTime/IsDeleted, and sync/async CRUD methods. + 包括 CreateTime/UpdateTime/IsDeleted、以及 CRUD 异步和同步方法的实体基类 + To delete data
删除数据
- 是否物理删除 + To flag whether to delete the physical level of the data
+ To recover deleted data
恢复删除的数据
+ To update data
更新数据
+ To insert data
插入数据
+ To insert or update data
更新或插入
+ To completely save the navigation properties of the entity in the form of sub-tables.
【完整】保存导航属性,子表
- 导航属性名 + Navigation property name
+ Entity base class, including CreateTime/UpdateTime/IsDeleted, the async CRUD methods, and ID primary key definition. + 包括 CreateTime/UpdateTime/IsDeleted、CRUD 异步方法、以及 ID 主键定义 的实体基类 + When TKey is int/long, the Id is set to be an auto-incremented primary key + 当 TKey 为 int/long 时,Id 主键被设为自增值主键 @@ -85,11 +104,13 @@ + Primary key
主键
+ Get data based on the value of the primary key
根据主键值获取数据
@@ -97,106 +118,138 @@
+ Entity base class, including CreateTime/UpdateTime/IsDeleted, and async CRUD methods. + 包括 CreateTime/UpdateTime/IsDeleted、以及 CRUD 异步方法的实体基类 + To delete data
删除数据
- 是否物理删除 + To flag whether to delete the physical level of the data
+ To recover deleted data
恢复删除的数据
+ To update data
更新数据
+ To insert data
插入数据
+ To insert or update data
更新或插入
+ To completely save the navigation properties of the entity in the form of sub-tables.
【完整】保存导航属性,子表
- 导航属性名 + Navigation property name
+ Entity base class, including CreateTime/UpdateTime/IsDeleted. + 包括 CreateTime/UpdateTime/IsDeleted 的实体基类 - 全局 IFreeSql orm 对象 + Global IFreeSql ORM Object
+ 全局 IFreeSql ORM 对象
- 初始化BaseEntity - BaseEntity.Initialization(new FreeSqlBuilder() + To initialize the BaseEntity
+ 初始化 BaseEntity - .UseAutoSyncStructure(true) - - .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5") - - .Build()); + BaseEntity.Initialization(
+ new FreeSqlBuilder()
+ .UseAutoSyncStructure(true)
+ .UseConnectionString(DataType.Sqlite, "data source=test.db;max pool size=5")
+ .Build());
- IFreeSql orm 对象 + IFreeSql ORM Object 工作单元(事务)委托,如果不使用事务请传 null解释:由于AsyncLocal平台兼容不好,所以交给外部管理
+ Created time
创建时间
+ Updated time
更新时间
+ Logical Delete
逻辑删除
+ Sort
排序
+ + + A readonly entity base class, including CreateTime/UpdateTime/IsDeleted. + + 包括 CreateTime/UpdateTime/IsDeleted 的只读实体基类 + + + + To query data
查询数据
- 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") + Query conditions
+ 查询条件,Where(a => a.Id> 10) + + Support navigation object query
+ 支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com")
lambda表达式
- 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") + Query conditions
+ 查询条件,Where(true, a => a.Id > 10) + + Support navigation object query
+ 支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com")
true 时生效 lambda表达式 @@ -204,12 +257,14 @@
+ Repository object.
仓储对象
- 附加实体,在更新数据时,只更新变化的部分 + To Attach entities. When updating data, only the changed part is updated.
+ 附加实体。在更新数据时,只更新变化的部分
diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.xml b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.xml index 9829e929..75b8c707 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.xml +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.xml @@ -6,11 +6,13 @@ - 当实体类属性为【对象】时,以JSON形式映射存储 + When the entity class property is , map storage in JSON format.
+ 当实体类属性为【对象】时,以 JSON 形式映射存储
+ When the entity class property is and the attribute is marked as , map storage in JSON format.
当实体类属性为【对象】时,并且标记特性 [JsonMap] 时,该属性将以JSON形式映射存储
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 02eb0609..27909b2e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -512,5 +512,14 @@
+ + + 批量注入 Repository,可以参考代码自行调整 + + + + + +
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 3109f8c4..b96ea0c2 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -404,6 +404,7 @@ public static partial class FreeSqlGlobalExtensions int level = -1) where T1 : class { var select = that as Select1Provider; + select._is_AsTreeCte = true; var tb = select._tables[0].Table; var navs = tb.Properties.Select(a => tb.GetTableRef(a.Key, false)) .Where(a => a != null && @@ -545,6 +546,7 @@ JOIN {select._commonUtils.QuoteSqlName(tb.DbName)} a ON cte_tbc.cte_id = a.{sele .WhereIf(level > 0, $"a.cte_level < {level + 1}") .OrderBy(up, "a.cte_level desc") as Select1Provider; + newSelect._is_AsTreeCte = true; newSelect._params = new List(select._params.ToArray()); newSelect._includeInfo = select._includeInfo; newSelect._includeManySubListOneToManyTempValue1 = select._includeManySubListOneToManyTempValue1; diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 9c849a52..06ac1dc3 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3172,177 +3172,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 查询 - - - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 在【主库】执行 - - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 可自定义解析表达式 @@ -4216,12 +4045,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4292,12 +4115,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 51088193..262e8b9a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -43,6 +43,7 @@ namespace FreeSql.Internal.CommonProvider public Expression _selectExpression; public List _whereGlobalFilter; public Func _cancel; + public bool _is_AsTreeCte; int _disposeCounter; ~Select0Provider() @@ -122,6 +123,7 @@ namespace FreeSql.Internal.CommonProvider to._selectExpression = from._selectExpression; to._whereGlobalFilter = new List(from._whereGlobalFilter.ToArray()); to._cancel = from._cancel; + to._is_AsTreeCte = from._is_AsTreeCte; } public Expression ConvertStringPropertyToExpression(string property, bool fromFirstTable = false) @@ -393,8 +395,11 @@ namespace FreeSql.Internal.CommonProvider if (_params.Any()) del._params = new List(_params.ToArray()); if (_whereGlobalFilter.Any()) del._whereGlobalFilter = new List(_whereGlobalFilter.ToArray()); del.WithConnection(_connection).WithTransaction(_transaction).CommandTimeout(_commandTimeout); - var trytbname = ""; - del.AsTable(old => GetTableRuleUnions().FirstOrDefault()?.TryGetValue(_tables[0].Table.Type, out trytbname) == true ? trytbname : null); + if (_is_AsTreeCte == false) + { + var trytbname = ""; + del.AsTable(old => GetTableRuleUnions().FirstOrDefault()?.TryGetValue(_tables[0].Table.Type, out trytbname) == true && trytbname.IndexOf(' ') == -1 ? trytbname : null); + } switch (_orm.Ado.DataType) { case DataType.Dameng: @@ -423,8 +428,11 @@ namespace FreeSql.Internal.CommonProvider if (_params.Any()) upd._params = new List(_params.ToArray()); if (_whereGlobalFilter.Any()) upd._whereGlobalFilter = new List(_whereGlobalFilter.ToArray()); upd.WithConnection(_connection).WithTransaction(_transaction).CommandTimeout(_commandTimeout); - var trytbname = ""; - upd.AsTable(old => GetTableRuleUnions().FirstOrDefault()?.TryGetValue(_tables[0].Table.Type, out trytbname) == true ? trytbname : null); + if (_is_AsTreeCte == false) + { + var trytbname = ""; + upd.AsTable(old => GetTableRuleUnions().FirstOrDefault()?.TryGetValue(_tables[0].Table.Type, out trytbname) == true && trytbname.IndexOf(' ') == -1 ? trytbname : null); + } switch (_orm.Ado.DataType) { case DataType.Dameng: