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: