From 4289d8da69c49fa1b066536635f1a100a2ef8243 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 04:50:21 +0800 Subject: [PATCH 1/6] - update internal code --- .../AggregateRootUtils.cs | 8 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 - FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 210 ++-- FreeSql/Internal/Model/TableInfo.cs | 2 +- FreeSql/Internal/UtilsExpressionTree.cs | 940 +++++++++--------- 6 files changed, 581 insertions(+), 590 deletions(-) diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs index 1f475509..f2cf5fc3 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs +++ b/Extensions/FreeSql.Extensions.AggregateRoot/AggregateRootRepository/AggregateRootUtils.cs @@ -135,7 +135,7 @@ namespace FreeSql } if (collectionBefore != null && collectionAfter == null) { - //foreach (var item in collectionBefore as IEnumerable) + //foreach (var item in collectionBefore) //{ // changelog.DeleteLog.Add(NativeTuple.Create(elementType, new[] { item })); // NavigateReader(boundaryName, fsql, elementType, item, (path, tr, ct, stackvs) => @@ -148,12 +148,12 @@ namespace FreeSql } Dictionary dictBefore = new Dictionary(); Dictionary dictAfter = new Dictionary(); - foreach (var item in collectionBefore as IEnumerable) + foreach (var item in collectionBefore) { var key = fsql.GetEntityKeyString(elementType, item, false); if (key != null) dictBefore.Add(key, item); } - foreach (var item in collectionAfter as IEnumerable) + foreach (var item in collectionAfter) { var key = fsql.GetEntityKeyString(elementType, item, false); if (key != null) @@ -385,7 +385,7 @@ namespace FreeSql if (propvalFrom == null) { EntityUtilExtensions.SetEntityValueWithPropertyName(fsql, entityType, entityTo, prop.Name, null); - return; + continue; } switch (tbref.RefType) { diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 6e4097e1..1eb8fe0b 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -22,7 +22,7 @@ - + diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 3a04ca77..f4a66a58 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1086,6 +1086,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5769,6 +5845,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and @@ -6285,115 +6383,3 @@ -`0})"> - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs index f06fe7d2..ac9ed301 100644 --- a/FreeSql/Internal/Model/TableInfo.cs +++ b/FreeSql/Internal/Model/TableInfo.cs @@ -26,7 +26,7 @@ namespace FreeSql.Internal.Model public bool DisableSyncStructure { get; set; } public string Comment { get; set; } public bool IsRereadSql { get; internal set; } - public bool IsDictionaryType { get; internal set; } + public bool IsDictionaryType { get; set; } public IAsTable AsTableImpl { get; internal set; } public ColumnInfo AsTableColumn { get; internal set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index d3f2caff..4e4ec68d 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -112,477 +112,22 @@ namespace FreeSql.Internal continue; } if (tp == null && colattr != null) colattr.IsIgnore = true; //无法匹配的属性,认定是导航属性,且自动过滤 - var colattrIsNullable = colattr?._IsNullable; - var colattrIsNull = colattr == null; - if (colattr == null) - colattr = new ColumnAttribute - { - Name = p.Name, - DbType = tp.dbtypeFull, - IsNullable = tp.isnullable ?? true, - MapType = p.PropertyType - }; - if (colattr._IsNullable == null) colattr._IsNullable = tp?.isnullable; - if (string.IsNullOrEmpty(colattr.DbType)) colattr.DbType = tp?.dbtypeFull ?? "varchar(255)"; - if (colattr.DbType.StartsWith("set(") || colattr.DbType.StartsWith("enum(")) - { - var leftBt = colattr.DbType.IndexOf('('); - colattr.DbType = colattr.DbType.Substring(0, leftBt).ToUpper() + colattr.DbType.Substring(leftBt); - } - else if (common._orm.Ado.DataType != DataType.ClickHouse) - colattr.DbType = colattr.DbType.ToUpper(); - if (colattrIsNull == false && colattrIsNullable == true) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); - if (colattrIsNull == false && colattrIsNullable == false && colattr.DbType.Contains("NOT NULL") == false) colattr.DbType = Regex.Replace(colattr.DbType, @"\bNULL\b", "").Trim() + " NOT NULL"; - if (colattr._IsNullable == null && tp != null && tp.isnullable == null) colattr.IsNullable = tp.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 (common.CodeFirst.IsSyncStructureToUpper) colattr.Name = colattr.Name.ToUpper(); + var col = ColumnAttributeToInfo(trytb, entityDefault, p.Name, p.PropertyType, setMethod == null, ref colattr, tp, common); + if (col == null) continue; - if ((colattr.IsNullable != true || colattr.IsIdentity == true || colattr.IsPrimary == true) && colattr.DbType.Contains("NOT NULL") == false && common._orm.Ado.DataType != DataType.ClickHouse) - { - colattr.IsNullable = false; - colattr.DbType = Regex.Replace(colattr.DbType, @"\bNULL\b", "").Trim() + " NOT NULL"; - } - if (colattr.IsNullable == true && colattr.DbType.Contains("NOT NULL")) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); - else if (colattr.IsNullable == true && !colattr.DbType.Contains("Nullable") && common._orm.Ado.DataType == DataType.ClickHouse) colattr.DbType = $"Nullable({colattr.DbType})"; - 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; - }); - if (colattr.IsIdentity == true && colattr.MapType.IsNumberType() == false) - colattr.IsIdentity = false; - if (setMethod == null) colattr.IsIgnore = true; + if (propsComment != null && propsComment.TryGetValue(p.Name, out var trycomment)) + col.Comment = trycomment; + if (string.IsNullOrEmpty(col.Comment) && propsCommentByDescAttr != null && propsCommentByDescAttr.TryGetValue(p.Name, out trycomment)) + col.Comment = trycomment; - var col = new ColumnInfo - { - Table = trytb, - CsName = p.Name, - CsType = p.PropertyType, - Attribute = colattr - }; - if (propsComment != null && propsComment.TryGetValue(p.Name, out var trycomment)) - col.Comment = trycomment; - if (string.IsNullOrEmpty(col.Comment) && propsCommentByDescAttr != null && propsCommentByDescAttr.TryGetValue(p.Name, out trycomment)) - col.Comment = trycomment; - - if (colattr.IsIgnore) - { - trytb.ColumnsByCsIgnore.Add(p.Name, col); - continue; - } - object defaultValue = null; - if (entityDefault != null) defaultValue = trytb.Properties[p.Name].GetValue(entityDefault, null); - if (p.PropertyType.IsEnum) - { - var isEqualsEnumValue = false; - var enumValues = Enum.GetValues(p.PropertyType); - for (var a = 0; a < enumValues.Length; a++) - if (object.Equals(defaultValue, enumValues.GetValue(a))) - { - isEqualsEnumValue = true; - break; - } - if (isEqualsEnumValue == false && enumValues.Length > 0) - defaultValue = enumValues.GetValue(0); - } - if (defaultValue != null && p.PropertyType != colattr.MapType) defaultValue = Utils.GetDataReaderValue(colattr.MapType, defaultValue); - if (defaultValue == null) defaultValue = tp?.defaultValue; - if (colattr.IsNullable == false && defaultValue == null) - { - var citype = colattr.MapType.IsNullableType() ? colattr.MapType.GetGenericArguments().FirstOrDefault() : colattr.MapType; - defaultValue = citype.CreateInstanceGetDefaultValue(); - } - try - { - var initParms = new List(); - col.DbDefaultValue = common.GetNoneParamaterSqlValue(initParms, "init", col, colattr.MapType, defaultValue); - if (initParms.Any()) col.DbDefaultValue = "NULL"; - } - catch - { - col.DbDefaultValue = "NULL"; - } - //if (defaultValue != null && colattr.MapType.NullableTypeOrThis() == typeof(DateTime)) - //{ - // var dt = (DateTime)defaultValue; - // if (Math.Abs(dt.Subtract(DateTime.Now).TotalSeconds) < 60) - // col.DbDefaultValue = common.Now; - // else if (Math.Abs(dt.Subtract(DateTime.UtcNow).TotalSeconds) < 60) - // col.DbDefaultValue = common.NowUtc; - //} - - if (common._orm.Ado.DataType == DataType.GBase) - { - if (colattr.IsIdentity == true) - { - var colType = col.CsType.NullableTypeOrThis(); - if (colType == typeof(int) || colType == typeof(uint)) - colattr.DbType = "SERIAL"; - else if (colType == typeof(long) || colType == typeof(ulong)) - colattr.DbType = "SERIAL8"; - } - if (colattr.MapType.NullableTypeOrThis() == typeof(DateTime)) - { - if (colattr._Precision == null) - { - colattr.DbType = "DATETIME YEAR TO FRACTION(3)"; - colattr.Precision = 3; - col.DbPrecision = 3; - } - else if (colattr._Precision == 0) - { - colattr.DbType = "DATETIME YEAR TO SECOND"; - } - else if (colattr._Precision > 0) - { - colattr.DbType = $"DATETIME YEAR TO FRACTION({colattr.Precision})"; - col.DbPrecision = (byte)colattr.Precision; - } - } - } - if (colattr.ServerTime != DateTimeKind.Unspecified && new[] { typeof(DateTime), typeof(DateTimeOffset) }.Contains(colattr.MapType.NullableTypeOrThis())) - { - var commonNow = common.Now; - var commonNowUtc = common.NowUtc; - switch (common._orm.Ado.DataType) - { - case DataType.MySql: - case DataType.OdbcMySql: //处理毫秒 - case DataType.CustomMySql: - var timeLength = 0; - var mTimeLength = Regex.Match(colattr.DbType, @"(DATETIME|TIMESTAMP)\s*\((\d+)\)"); - if (mTimeLength.Success) timeLength = int.Parse(mTimeLength.Groups[2].Value); - if (timeLength > 0 && timeLength < 7) - { - commonNow = $"{commonNow.TrimEnd('(', ')')}({timeLength})"; - commonNowUtc = $"{commonNowUtc.TrimEnd('(', ')')}({timeLength})"; - } - //https://github.com/dotnetcore/FreeSql/issues/1604 mysql 不支持默认值 utc_timestamp DDL - if (colattr.ServerTime == DateTimeKind.Local) - col.DbDefaultValue = commonNow; - break; - default: - col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; - break; - } - col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; - col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; - } - if (string.IsNullOrEmpty(colattr.InsertValueSql) == false) - { - col.DbDefaultValue = colattr.InsertValueSql; - col.DbInsertValue = colattr.InsertValueSql; - } - if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0) - { - int strlen = colattr.StringLength; - var charPatten = @"(CHARACTER|CHAR2|CHAR)\s*(\([^\)]*\))?"; - var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; - switch (common._orm.Ado.DataType) - { - case DataType.MySql: - case DataType.OdbcMySql: - case DataType.CustomMySql: - if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; - else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.SqlServer: - case DataType.OdbcSqlServer: - case DataType.CustomSqlServer: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)"); - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.PostgreSQL: - case DataType.OdbcPostgreSQL: - case DataType.CustomPostgreSQL: - case DataType.KingbaseES: - case DataType.OdbcKingbaseES: - case DataType.ShenTong: - if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.Oracle: - case DataType.CustomOracle: - if (strlen < 0) colattr.DbType = $"NCLOB{strNotNull}"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.Dameng: - if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.OdbcOracle: - case DataType.OdbcDameng: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); //ODBC 不支持 NCLOB - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.Sqlite: - if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.MsAccess: - charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; - if (strlen < 0) colattr.DbType = $"LONGTEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.Firebird: - charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; - if (strlen < 0) colattr.DbType = $"BLOB SUB_TYPE 1{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - case DataType.GBase: - if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); - break; - } - } - if (colattr.MapType == typeof(string) && colattr.IsVersion == true) colattr.StringLength = 40; - if (colattr.MapType == typeof(byte[]) && colattr.IsVersion == true) colattr.StringLength = 16; // 8=sqlserver timestamp, 16=GuidToBytes - if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0) - { - int strlen = colattr.StringLength; - var bytePatten = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; - var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; - switch (common._orm.Ado.DataType) - { - case DataType.MySql: - case DataType.OdbcMySql: - case DataType.CustomMySql: - if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}"; - else if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); - break; - case DataType.SqlServer: - case DataType.OdbcSqlServer: - case DataType.CustomSqlServer: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1(MAX)"); - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); - break; - case DataType.PostgreSQL: - case DataType.OdbcPostgreSQL: - case DataType.CustomPostgreSQL: - case DataType.KingbaseES: - case DataType.OdbcKingbaseES: - case DataType.ShenTong: //驱动引发的异常:“System.Data.OscarClient.OscarException”(位于 System.Data.OscarClient.dll 中) - colattr.DbType = $"BYTEA{strNotNull}"; //变长二进制串 - break; - case DataType.Oracle: - case DataType.CustomOracle: - colattr.DbType = $"BLOB{strNotNull}"; - break; - case DataType.Dameng: - colattr.DbType = $"BLOB{strNotNull}"; - break; - case DataType.OdbcOracle: - case DataType.OdbcDameng: - colattr.DbType = $"BLOB{strNotNull}"; - break; - case DataType.Sqlite: - colattr.DbType = $"BLOB{strNotNull}"; - break; - case DataType.MsAccess: - if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); - break; - case DataType.Firebird: - colattr.DbType = $"BLOB{strNotNull}"; - break; - case DataType.GBase: - colattr.DbType = $"BYTE{strNotNull}"; - break; - } - } - if (colattr.MapType.NullableTypeOrThis() == typeof(decimal) && (colattr.Precision > 0 || colattr.Scale > 0)) - { - if (colattr.Precision <= 0) colattr.Precision = 10; - if (colattr.Scale <= 0) colattr.Scale = 0; - var decimalPatten = @"(DECIMAL|NUMERIC|NUMBER)\s*(\([^\)]*\))?"; - colattr.DbType = Regex.Replace(colattr.DbType, decimalPatten, $"$1({colattr.Precision},{colattr.Scale})"); - } - - if (trytb.Columns.ContainsKey(colattr.Name)) throw new Exception(CoreStrings.Duplicate_ColumnAttribute(colattr.Name)); - if (trytb.ColumnsByCs.ContainsKey(p.Name)) throw new Exception(CoreStrings.Duplicate_PropertyName(p.Name)); - - trytb.Columns.Add(colattr.Name, col); + trytb.Columns.Add(colattr.Name, col); trytb.ColumnsByCs.Add(p.Name, col); columnsList.Add(col); } - trytb.VersionColumn = trytb.Columns.Values.Where(a => a.Attribute.IsVersion == true).LastOrDefault(); - if (trytb.VersionColumn != null) - { - if (trytb.VersionColumn.Attribute.MapType.IsNullableType() || - trytb.VersionColumn.Attribute.MapType.IsNumberType() == false && !new[] { typeof(byte[]), typeof(string) }.Contains(trytb.VersionColumn.Attribute.MapType)) - throw new Exception(CoreStrings.Properties_AsRowLock_Must_Numeric_Byte(trytb.VersionColumn.CsName)); - } - tbattr?.ParseAsTable(trytb); - var indexesDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - //从数据库查找主键、自增、索引 - if (common.CodeFirst.IsConfigEntityFromDbFirst) - { - try - { - if (common._orm.DbFirst != null) - { - if (common.dbTables == null) - lock (common.dbTablesLock) - if (common.dbTables == null) - common.dbTables = common._orm.DbFirst.GetTablesByDatabase(); - - var finddbtbs = common.dbTables.Where(a => string.Compare(a.Name, trytb.CsName, true) == 0 || string.Compare(a.Name, trytb.DbName, true) == 0); - foreach (var dbtb in finddbtbs) - { - foreach (var dbident in dbtb.Identitys) - { - if (trytb.Columns.TryGetValue(dbident.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbident.CsType.NullableTypeOrThis() || - trytb.ColumnsByCs.TryGetValue(dbident.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbident.CsType.NullableTypeOrThis()) - trycol.Attribute.IsIdentity = true; - } - foreach (var dbpk in dbtb.Primarys) - { - if (trytb.Columns.TryGetValue(dbpk.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbpk.CsType.NullableTypeOrThis() || - trytb.ColumnsByCs.TryGetValue(dbpk.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbpk.CsType.NullableTypeOrThis()) - trycol.Attribute.IsPrimary = true; - } - foreach (var dbidx in dbtb.IndexesDict) - { - var indexColumns = new List(); - foreach (var dbcol in dbidx.Value.Columns) - { - if (trytb.Columns.TryGetValue(dbcol.Column.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbcol.Column.CsType.NullableTypeOrThis() || - trytb.ColumnsByCs.TryGetValue(dbcol.Column.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbcol.Column.CsType.NullableTypeOrThis()) - indexColumns.Add(new IndexColumnInfo - { - Column = trycol, - IsDesc = dbcol.IsDesc - }); - } - if (indexColumns.Any() == false) continue; - if (indexesDict.ContainsKey(dbidx.Key)) indexesDict.Remove(dbidx.Key); - indexesDict.Add(dbidx.Key, new IndexInfo - { - Name = dbidx.Key, - Columns = indexColumns.ToArray(), - IsUnique = dbidx.Value.IsUnique, - IndexMethod = IndexMethod.B_Tree - }); - } - } - } - } - catch { } - } - //索引和唯一键 var indexes = common.GetEntityIndexAttribute(trytb.Type); - foreach (var index in indexes) - { - var val = index.Fields?.Trim(' ', '\t', ','); - if (string.IsNullOrEmpty(val)) continue; - var arr = val.Split(',').Select(a => a.Trim(' ', '\t').Trim()).Where(a => !string.IsNullOrEmpty(a)).ToArray(); - if (arr.Any() == false) continue; - var indexColumns = new List(); - foreach (var field in arr) - { - var idxcol = new IndexColumnInfo(); - if (field.EndsWith(" DESC", StringComparison.CurrentCultureIgnoreCase)) idxcol.IsDesc = true; - var colname = Regex.Replace(field, " (DESC|ASC)", "", RegexOptions.IgnoreCase); - if (trytb.ColumnsByCs.TryGetValue(colname, out var trycol) || trytb.Columns.TryGetValue(colname, out trycol)) - { - idxcol.Column = trycol; - indexColumns.Add(idxcol); - } - } - if (indexColumns.Any() == false) continue; - var indexName = common.CodeFirst.IsSyncStructureToLower ? index.Name.ToLower() : (common.CodeFirst.IsSyncStructureToUpper ? index.Name.ToUpper() : index.Name); - if (indexesDict.ContainsKey(indexName)) indexesDict.Remove(indexName); - indexesDict.Add(indexName, new IndexInfo - { - Name = indexName, - Columns = indexColumns.ToArray(), - IsUnique = index.IsUnique, - IndexMethod = index.IndexMethod - }); - } - trytb.Indexes = indexesDict.Values.ToArray(); - - 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._IsPrimary == null && string.Compare(a.Attribute.Name, "id", true) == 0).ToArray(); - if (trytb.Primarys.Any() == false) - { - var identcol = trytb.Columns.Values.Where(a => a.Attribute.IsIdentity == true).FirstOrDefault(); - if (identcol != null) trytb.Primarys = new[] { identcol }; - if (trytb.Primarys.Any() == false) - { - trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute._IsPrimary == null && string.Compare(a.Attribute.Name, $"{trytb.DbName}id", true) == 0).ToArray(); - if (trytb.Primarys.Any() == false) - { - trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute._IsPrimary == null && string.Compare(a.Attribute.Name, $"{trytb.DbName}_id", true) == 0).ToArray(); - } - } - } - foreach (var col in trytb.Primarys) - col.Attribute.IsPrimary = true; - } - foreach (var col in trytb.Primarys) - { - col.Attribute.IsNullable = false; - col.Attribute.DbType = col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(); - switch (common._orm.Ado.DataType) - { - case DataType.Sqlite: - col.Attribute.DbType += " NOT NULL"; //sqlite 主键也可以插入 null - break; - } - } - foreach (var col in trytb.Columns.Values) - { - if (col.Attribute.IsPrimary == false && col.Attribute.IsIdentity) col.Attribute.CanUpdate = false; - var ltp = @"\(([^\)]+)\)"; - col.DbTypeText = Regex.Replace(col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(), ltp, ""); - var m = Regex.Match(col.Attribute.DbType, ltp); - if (m.Success == false) continue; - var sizeStr = m.Groups[1].Value.Trim(); - if (sizeStr.EndsWith(" BYTE") || sizeStr.EndsWith(" CHAR")) sizeStr = sizeStr.Remove(sizeStr.Length - 5); //ORACLE - if (string.Compare(sizeStr, "max", true) == 0) - { - col.DbSize = -1; - continue; - } - var sizeArr = sizeStr.Split(','); - if (int.TryParse(sizeArr[0].Trim(), out var size) == false) continue; - if (col.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime)) - { - col.DbScale = (byte)size; - if (col.Attribute.Scale <= 0) col.Attribute.Scale = col.DbScale; - continue; - } - if (sizeArr.Length == 1) - { - col.DbSize = size; - if (col.Attribute.StringLength <= 0) col.Attribute.StringLength = col.DbSize; - continue; - } - if (byte.TryParse(sizeArr[1], out var scale) == false) continue; - col.DbPrecision = (byte)size; - col.DbScale = scale; - if (col.Attribute.Precision <= 0) - { - col.Attribute.Precision = col.DbPrecision; - col.Attribute.Scale = col.DbScale; - } - } - trytb.IsRereadSql = trytb.Columns.Where(a => string.IsNullOrWhiteSpace(a.Value.Attribute.RereadSql) == false).Any(); - trytb.ColumnsByPosition = columnsList.Where(a => a.Attribute.Position > 0).OrderBy(a => a.Attribute.Position) - .Concat(columnsList.Where(a => a.Attribute.Position == 0)) - .Concat(columnsList.Where(a => a.Attribute.Position < 0).OrderBy(a => a.Attribute.Position)).ToArray(); - trytb.ColumnsByCanUpdateDbUpdateValue = columnsList.Where(a => a.Attribute.CanUpdate == true && string.IsNullOrEmpty(a.DbUpdateValue) == false).ToArray(); + AuditTableInfo(trytb, tbattr, indexes, columnsList, common); tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb); #region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类 @@ -635,6 +180,475 @@ namespace FreeSql.Internal return tbc.TryGetValue(entity, out var trytb2) ? trytb2 : trytb; } + public static ColumnInfo ColumnAttributeToInfo(TableInfo trytb, object entityDefault, string csName, Type mapType, bool isIgnore, ref ColumnAttribute colattr, DbInfoResult tp, CommonUtils common) + { + var colattrIsNullable = colattr?._IsNullable; + var colattrIsNull = colattr == null; + if (colattr == null) + colattr = new ColumnAttribute + { + Name = csName, + DbType = tp.dbtypeFull, + IsNullable = tp.isnullable ?? true, + MapType = mapType + }; + if (colattr._IsNullable == null) colattr._IsNullable = tp?.isnullable; + if (string.IsNullOrEmpty(colattr.DbType)) colattr.DbType = tp?.dbtypeFull ?? "varchar(255)"; + if (colattr.DbType.StartsWith("set(") || colattr.DbType.StartsWith("enum(")) + { + var leftBt = colattr.DbType.IndexOf('('); + colattr.DbType = colattr.DbType.Substring(0, leftBt).ToUpper() + colattr.DbType.Substring(leftBt); + } + else if (common._orm.Ado.DataType != DataType.ClickHouse) + colattr.DbType = colattr.DbType.ToUpper(); + + if (colattrIsNull == false && colattrIsNullable == true) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); + if (colattrIsNull == false && colattrIsNullable == false && colattr.DbType.Contains("NOT NULL") == false) colattr.DbType = Regex.Replace(colattr.DbType, @"\bNULL\b", "").Trim() + " NOT NULL"; + if (colattr._IsNullable == null && tp != null && tp.isnullable == null) colattr.IsNullable = tp.dbtypeFull.Contains("NOT NULL") == false; + if (colattr.DbType?.Contains("NOT NULL") == true) colattr.IsNullable = false; + if (string.IsNullOrEmpty(colattr.Name)) colattr.Name = csName; + if (common.CodeFirst.IsSyncStructureToLower) colattr.Name = colattr.Name.ToLower(); + if (common.CodeFirst.IsSyncStructureToUpper) colattr.Name = colattr.Name.ToUpper(); + + if ((colattr.IsNullable != true || colattr.IsIdentity == true || colattr.IsPrimary == true) && colattr.DbType.Contains("NOT NULL") == false && common._orm.Ado.DataType != DataType.ClickHouse) + { + colattr.IsNullable = false; + colattr.DbType = Regex.Replace(colattr.DbType, @"\bNULL\b", "").Trim() + " NOT NULL"; + } + if (colattr.IsNullable == true && colattr.DbType.Contains("NOT NULL")) colattr.DbType = colattr.DbType.Replace("NOT NULL", ""); + else if (colattr.IsNullable == true && !colattr.DbType.Contains("Nullable") && common._orm.Ado.DataType == DataType.ClickHouse) colattr.DbType = $"Nullable({colattr.DbType})"; + 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; + }); + if (colattr.IsIdentity == true && colattr.MapType.IsNumberType() == false) + colattr.IsIdentity = false; + if (isIgnore) colattr.IsIgnore = true; + + var col = new ColumnInfo + { + Table = trytb, + CsName = csName, + CsType = mapType, + Attribute = colattr + }; + + if (colattr.IsIgnore) + { + trytb.ColumnsByCsIgnore.Add(csName, col); + return null; + } + object defaultValue = null; + if (entityDefault != null) defaultValue = trytb.Properties[csName].GetValue(entityDefault, null); + if (defaultValue != null && mapType.IsEnum) + { + var isEqualsEnumValue = false; + var enumValues = Enum.GetValues(mapType); + for (var a = 0; a < enumValues.Length; a++) + if (object.Equals(defaultValue, enumValues.GetValue(a))) + { + isEqualsEnumValue = true; + break; + } + if (isEqualsEnumValue == false && enumValues.Length > 0) + defaultValue = enumValues.GetValue(0); + } + if (defaultValue != null && mapType != colattr.MapType) defaultValue = Utils.GetDataReaderValue(colattr.MapType, defaultValue); + if (defaultValue == null) defaultValue = tp?.defaultValue; + if (colattr.IsNullable == false && defaultValue == null) + { + var citype = colattr.MapType.IsNullableType() ? colattr.MapType.GetGenericArguments().FirstOrDefault() : colattr.MapType; + defaultValue = citype.CreateInstanceGetDefaultValue(); + } + try + { + var initParms = new List(); + col.DbDefaultValue = common.GetNoneParamaterSqlValue(initParms, "init", col, colattr.MapType, defaultValue); + if (initParms.Any()) col.DbDefaultValue = "NULL"; + } + catch + { + col.DbDefaultValue = "NULL"; + } + //if (defaultValue != null && colattr.MapType.NullableTypeOrThis() == typeof(DateTime)) + //{ + // var dt = (DateTime)defaultValue; + // if (Math.Abs(dt.Subtract(DateTime.Now).TotalSeconds) < 60) + // col.DbDefaultValue = common.Now; + // else if (Math.Abs(dt.Subtract(DateTime.UtcNow).TotalSeconds) < 60) + // col.DbDefaultValue = common.NowUtc; + //} + + if (common._orm.Ado.DataType == DataType.GBase) + { + if (colattr.IsIdentity == true) + { + var colType = col.CsType.NullableTypeOrThis(); + if (colType == typeof(int) || colType == typeof(uint)) + colattr.DbType = "SERIAL"; + else if (colType == typeof(long) || colType == typeof(ulong)) + colattr.DbType = "SERIAL8"; + } + if (colattr.MapType.NullableTypeOrThis() == typeof(DateTime)) + { + if (colattr._Precision == null) + { + colattr.DbType = "DATETIME YEAR TO FRACTION(3)"; + colattr.Precision = 3; + col.DbPrecision = 3; + } + else if (colattr._Precision == 0) + { + colattr.DbType = "DATETIME YEAR TO SECOND"; + } + else if (colattr._Precision > 0) + { + colattr.DbType = $"DATETIME YEAR TO FRACTION({colattr.Precision})"; + col.DbPrecision = (byte)colattr.Precision; + } + } + } + if (colattr.ServerTime != DateTimeKind.Unspecified && new[] { typeof(DateTime), typeof(DateTimeOffset) }.Contains(colattr.MapType.NullableTypeOrThis())) + { + var commonNow = common.Now; + var commonNowUtc = common.NowUtc; + switch (common._orm.Ado.DataType) + { + case DataType.MySql: + case DataType.OdbcMySql: //处理毫秒 + case DataType.CustomMySql: + var timeLength = 0; + var mTimeLength = Regex.Match(colattr.DbType, @"(DATETIME|TIMESTAMP)\s*\((\d+)\)"); + if (mTimeLength.Success) timeLength = int.Parse(mTimeLength.Groups[2].Value); + if (timeLength > 0 && timeLength < 7) + { + commonNow = $"{commonNow.TrimEnd('(', ')')}({timeLength})"; + commonNowUtc = $"{commonNowUtc.TrimEnd('(', ')')}({timeLength})"; + } + //https://github.com/dotnetcore/FreeSql/issues/1604 mysql 不支持默认值 utc_timestamp DDL + if (colattr.ServerTime == DateTimeKind.Local) + col.DbDefaultValue = commonNow; + break; + default: + col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; + break; + } + col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; + col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; + } + if (string.IsNullOrEmpty(colattr.InsertValueSql) == false) + { + col.DbDefaultValue = colattr.InsertValueSql; + col.DbInsertValue = colattr.InsertValueSql; + } + if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0) + { + int strlen = colattr.StringLength; + var charPatten = @"(CHARACTER|CHAR2|CHAR)\s*(\([^\)]*\))?"; + var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; + switch (common._orm.Ado.DataType) + { + case DataType.MySql: + case DataType.OdbcMySql: + case DataType.CustomMySql: + if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; + else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.SqlServer: + case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.PostgreSQL: + case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: + case DataType.KingbaseES: + case DataType.OdbcKingbaseES: + case DataType.ShenTong: + if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.Oracle: + case DataType.CustomOracle: + if (strlen < 0) colattr.DbType = $"NCLOB{strNotNull}"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.Dameng: + if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.OdbcOracle: + case DataType.OdbcDameng: + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); //ODBC 不支持 NCLOB + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.Sqlite: + if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.MsAccess: + charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; + if (strlen < 0) colattr.DbType = $"LONGTEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.Firebird: + charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; + if (strlen < 0) colattr.DbType = $"BLOB SUB_TYPE 1{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + case DataType.GBase: + if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; + } + } + if (colattr.MapType == typeof(string) && colattr.IsVersion == true) colattr.StringLength = 40; + if (colattr.MapType == typeof(byte[]) && colattr.IsVersion == true) colattr.StringLength = 16; // 8=sqlserver timestamp, 16=GuidToBytes + if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0) + { + int strlen = colattr.StringLength; + var bytePatten = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; + var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; + switch (common._orm.Ado.DataType) + { + case DataType.MySql: + case DataType.OdbcMySql: + case DataType.CustomMySql: + if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}"; + else if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + break; + case DataType.SqlServer: + case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1(MAX)"); + else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + break; + case DataType.PostgreSQL: + case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: + case DataType.KingbaseES: + case DataType.OdbcKingbaseES: + case DataType.ShenTong: //驱动引发的异常:“System.Data.OscarClient.OscarException”(位于 System.Data.OscarClient.dll 中) + colattr.DbType = $"BYTEA{strNotNull}"; //变长二进制串 + break; + case DataType.Oracle: + case DataType.CustomOracle: + colattr.DbType = $"BLOB{strNotNull}"; + break; + case DataType.Dameng: + colattr.DbType = $"BLOB{strNotNull}"; + break; + case DataType.OdbcOracle: + case DataType.OdbcDameng: + colattr.DbType = $"BLOB{strNotNull}"; + break; + case DataType.Sqlite: + colattr.DbType = $"BLOB{strNotNull}"; + break; + case DataType.MsAccess: + if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + break; + case DataType.Firebird: + colattr.DbType = $"BLOB{strNotNull}"; + break; + case DataType.GBase: + colattr.DbType = $"BYTE{strNotNull}"; + break; + } + } + if (colattr.MapType.NullableTypeOrThis() == typeof(decimal) && (colattr.Precision > 0 || colattr.Scale > 0)) + { + if (colattr.Precision <= 0) colattr.Precision = 10; + if (colattr.Scale <= 0) colattr.Scale = 0; + var decimalPatten = @"(DECIMAL|NUMERIC|NUMBER)\s*(\([^\)]*\))?"; + colattr.DbType = Regex.Replace(colattr.DbType, decimalPatten, $"$1({colattr.Precision},{colattr.Scale})"); + } + + if (trytb.Columns.ContainsKey(colattr.Name)) throw new Exception(CoreStrings.Duplicate_ColumnAttribute(colattr.Name)); + if (trytb.ColumnsByCs.ContainsKey(csName)) throw new Exception(CoreStrings.Duplicate_PropertyName(csName)); + + return col; + } + public static void AuditTableInfo(TableInfo trytb, TableAttribute tbattr, IEnumerable indexes, List columnsList, CommonUtils common) + { + trytb.VersionColumn = trytb.Columns.Values.Where(a => a.Attribute.IsVersion == true).LastOrDefault(); + if (trytb.VersionColumn != null) + { + if (trytb.VersionColumn.Attribute.MapType.IsNullableType() || + trytb.VersionColumn.Attribute.MapType.IsNumberType() == false && !new[] { typeof(byte[]), typeof(string) }.Contains(trytb.VersionColumn.Attribute.MapType)) + throw new Exception(CoreStrings.Properties_AsRowLock_Must_Numeric_Byte(trytb.VersionColumn.CsName)); + } + tbattr?.ParseAsTable(trytb); + + var indexesDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + //从数据库查找主键、自增、索引 + if (common.CodeFirst.IsConfigEntityFromDbFirst) + { + try + { + if (common._orm.DbFirst != null) + { + if (common.dbTables == null) + lock (common.dbTablesLock) + if (common.dbTables == null) + common.dbTables = common._orm.DbFirst.GetTablesByDatabase(); + + var finddbtbs = common.dbTables.Where(a => string.Compare(a.Name, trytb.CsName, true) == 0 || string.Compare(a.Name, trytb.DbName, true) == 0); + foreach (var dbtb in finddbtbs) + { + foreach (var dbident in dbtb.Identitys) + { + if (trytb.Columns.TryGetValue(dbident.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbident.CsType.NullableTypeOrThis() || + trytb.ColumnsByCs.TryGetValue(dbident.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbident.CsType.NullableTypeOrThis()) + trycol.Attribute.IsIdentity = true; + } + foreach (var dbpk in dbtb.Primarys) + { + if (trytb.Columns.TryGetValue(dbpk.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbpk.CsType.NullableTypeOrThis() || + trytb.ColumnsByCs.TryGetValue(dbpk.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbpk.CsType.NullableTypeOrThis()) + trycol.Attribute.IsPrimary = true; + } + foreach (var dbidx in dbtb.IndexesDict) + { + var indexColumns = new List(); + foreach (var dbcol in dbidx.Value.Columns) + { + if (trytb.Columns.TryGetValue(dbcol.Column.Name, out var trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbcol.Column.CsType.NullableTypeOrThis() || + trytb.ColumnsByCs.TryGetValue(dbcol.Column.Name, out trycol) && trycol.Attribute.MapType.NullableTypeOrThis() == dbcol.Column.CsType.NullableTypeOrThis()) + indexColumns.Add(new IndexColumnInfo + { + Column = trycol, + IsDesc = dbcol.IsDesc + }); + } + if (indexColumns.Any() == false) continue; + if (indexesDict.ContainsKey(dbidx.Key)) indexesDict.Remove(dbidx.Key); + indexesDict.Add(dbidx.Key, new IndexInfo + { + Name = dbidx.Key, + Columns = indexColumns.ToArray(), + IsUnique = dbidx.Value.IsUnique, + IndexMethod = IndexMethod.B_Tree + }); + } + } + } + } + catch { } + } + //索引和唯一键 + foreach (var index in indexes) + { + var val = index.Fields?.Trim(' ', '\t', ','); + if (string.IsNullOrEmpty(val)) continue; + var arr = val.Split(',').Select(a => a.Trim(' ', '\t').Trim()).Where(a => !string.IsNullOrEmpty(a)).ToArray(); + if (arr.Any() == false) continue; + var indexColumns = new List(); + foreach (var field in arr) + { + var idxcol = new IndexColumnInfo(); + if (field.EndsWith(" DESC", StringComparison.CurrentCultureIgnoreCase)) idxcol.IsDesc = true; + var colname = Regex.Replace(field, " (DESC|ASC)", "", RegexOptions.IgnoreCase); + if (trytb.ColumnsByCs.TryGetValue(colname, out var trycol) || trytb.Columns.TryGetValue(colname, out trycol)) + { + idxcol.Column = trycol; + indexColumns.Add(idxcol); + } + } + if (indexColumns.Any() == false) continue; + var indexName = common.CodeFirst.IsSyncStructureToLower ? index.Name.ToLower() : (common.CodeFirst.IsSyncStructureToUpper ? index.Name.ToUpper() : index.Name); + if (indexesDict.ContainsKey(indexName)) indexesDict.Remove(indexName); + indexesDict.Add(indexName, new IndexInfo + { + Name = indexName, + Columns = indexColumns.ToArray(), + IsUnique = index.IsUnique, + IndexMethod = index.IndexMethod + }); + } + trytb.Indexes = indexesDict.Values.ToArray(); + + 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._IsPrimary == null && string.Compare(a.Attribute.Name, "id", true) == 0).ToArray(); + if (trytb.Primarys.Any() == false) + { + var identcol = trytb.Columns.Values.Where(a => a.Attribute.IsIdentity == true).FirstOrDefault(); + if (identcol != null) trytb.Primarys = new[] { identcol }; + if (trytb.Primarys.Any() == false) + { + trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute._IsPrimary == null && string.Compare(a.Attribute.Name, $"{trytb.DbName}id", true) == 0).ToArray(); + if (trytb.Primarys.Any() == false) + { + trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute._IsPrimary == null && string.Compare(a.Attribute.Name, $"{trytb.DbName}_id", true) == 0).ToArray(); + } + } + } + foreach (var col in trytb.Primarys) + col.Attribute.IsPrimary = true; + } + foreach (var col in trytb.Primarys) + { + col.Attribute.IsNullable = false; + col.Attribute.DbType = col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(); + switch (common._orm.Ado.DataType) + { + case DataType.Sqlite: + col.Attribute.DbType += " NOT NULL"; //sqlite 主键也可以插入 null + break; + } + } + foreach (var col in trytb.Columns.Values) + { + if (col.Attribute.IsPrimary == false && col.Attribute.IsIdentity) col.Attribute.CanUpdate = false; + var ltp = @"\(([^\)]+)\)"; + col.DbTypeText = Regex.Replace(col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(), ltp, ""); + var m = Regex.Match(col.Attribute.DbType, ltp); + if (m.Success == false) continue; + var sizeStr = m.Groups[1].Value.Trim(); + if (sizeStr.EndsWith(" BYTE") || sizeStr.EndsWith(" CHAR")) sizeStr = sizeStr.Remove(sizeStr.Length - 5); //ORACLE + if (string.Compare(sizeStr, "max", true) == 0) + { + col.DbSize = -1; + continue; + } + var sizeArr = sizeStr.Split(','); + if (int.TryParse(sizeArr[0].Trim(), out var size) == false) continue; + if (col.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime)) + { + col.DbScale = (byte)size; + if (col.Attribute.Scale <= 0) col.Attribute.Scale = col.DbScale; + continue; + } + if (sizeArr.Length == 1) + { + col.DbSize = size; + if (col.Attribute.StringLength <= 0) col.Attribute.StringLength = col.DbSize; + continue; + } + if (byte.TryParse(sizeArr[1], out var scale) == false) continue; + col.DbPrecision = (byte)size; + col.DbScale = scale; + if (col.Attribute.Precision <= 0) + { + col.Attribute.Precision = col.DbPrecision; + col.Attribute.Scale = col.DbScale; + } + } + trytb.IsRereadSql = trytb.Columns.Where(a => string.IsNullOrWhiteSpace(a.Value.Attribute.RereadSql) == false).Any(); + trytb.ColumnsByPosition = columnsList.Where(a => a.Attribute.Position > 0).OrderBy(a => a.Attribute.Position) + .Concat(columnsList.Where(a => a.Attribute.Position == 0)) + .Concat(columnsList.Where(a => a.Attribute.Position < 0).OrderBy(a => a.Attribute.Position)).ToArray(); + trytb.ColumnsByCanUpdateDbUpdateValue = columnsList.Where(a => a.Attribute.CanUpdate == true && string.IsNullOrEmpty(a.DbUpdateValue) == false).ToArray(); + } public static void AddTableRef(CommonUtils common, TableInfo trytb, PropertyInfo pnv, bool isLazy, NativeTuple vp, StringBuilder cscode) { var getMethod = vp?.Item4; From 14b15a8aaa0a2e4de926477917b68b9a43314e21 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 13:04:52 +0800 Subject: [PATCH 2/6] v3.2.806-preview20231122 --- Directory.Build.props | 2 +- Examples/base_entity/Program.cs | 43 +++++++- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- .../MySql/MySqlAdo/MySqlAdoTest.cs | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 98 ------------------- FreeSql/Internal/ObjectPool/ObjectPool.cs | 4 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 35 files changed, 73 insertions(+), 136 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 0b2f753b..e93b69a3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 0c01dd6f..3ce4b208 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -561,8 +561,8 @@ namespace base_entity .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;min pool size=1;Max pool size=3;AllowLoadLocalInfile=true") - //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") - + .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") + .UseAdoConnectionPool(false) //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") ////.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=toc;Pooling=true;Maximum Pool Size=2") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) @@ -589,7 +589,7 @@ namespace base_entity //.UseConnectionString(DataType.ClickHouse, "DataCompress=False;BufferSize=32768;SocketTimeout=10000;CheckCompressedHash=False;Encrypt=False;Compressor=lz4;Host=192.168.0.121;Port=8125;Database=PersonnelLocation;Username=root;Password=123") .UseMonitorCommand(cmd => { - Console.WriteLine(cmd.CommandText + "\r\n"); + //Console.WriteLine(cmd.CommandText + "\r\n"); //cmd.CommandText = null; //不执行 //if (cmd.CommandText.StartsWith("")) @@ -598,7 +598,42 @@ namespace base_entity .UseGenerateCommandParameterWithLambda(true) .Build(); BaseEntity.Initialization(fsql, () => _asyncUow.Value); - #endregion + #endregion + fsql.Select().First(); + var running = true; + for (var a = 0; a < 100; a++) + { + new Thread(() => + { + while (running) + { + try + { + fsql.Select().First(); + } + catch(Exception ex) + { + Console.WriteLine(ex.Message); + } + Task.Run(async () => + { + try + { + await fsql.Select().FirstAsync(); + } + catch (Exception ex) + { + Console.WriteLine("Async:" + ex.Message); + } + }); + } + }).Start(); + } + + Console.ReadKey(); + running = false; + fsql.Dispose(); + return; var x01sql01 = fsql.Select() .Include(a => a.Test1) diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index c1827136..1a52e189 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 403c78c2..eb1db916 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 029905f1..957dfc60 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 69367531..29c3317a 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index a1f097e4..601d8fdd 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 52f74474..09ea7bf3 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 1e0cb202..517dddfe 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 92fd128d..716678fe 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 1fea5802..e61b2ce4 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs index 2c8aebec..c56f8764 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlAdo/MySqlAdoTest.cs @@ -17,7 +17,7 @@ namespace FreeSql.Tests.MySql .UseConnectionFactory(FreeSql.DataType.MySql, () => new MySqlConnection(connectionString)) .Build()) { - Assert.Equal("server=127.0.0.1;port=3306;user id=root;password=root;database=cccddd;characterset=utf8;sslmode=Disabled;maxpoolsize=51;allowuservariables=True", t2.Ado.ConnectionString); + Assert.Equal("server=127.0.0.1;port=3306;user id=root;password=root;database=cccddd;characterset=utf8;sslmode=none;maxpoolsize=51;allowuservariables=True", t2.Ado.ConnectionString); } } diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 1eb8fe0b..5cb46069 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index f4a66a58..ea78dcc5 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1086,82 +1086,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5845,28 +5769,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/FreeSql/Internal/ObjectPool/ObjectPool.cs b/FreeSql/Internal/ObjectPool/ObjectPool.cs index 89b711f9..15c4e1e4 100644 --- a/FreeSql/Internal/ObjectPool/ObjectPool.cs +++ b/FreeSql/Internal/ObjectPool/ObjectPool.cs @@ -352,7 +352,7 @@ namespace FreeSql.Internal.ObjectPool } catch { - Return(obj); + Return(obj, true); throw; } @@ -404,7 +404,7 @@ namespace FreeSql.Internal.ObjectPool } catch { - Return(obj); + Return(obj, true); throw; } diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index da3b8eaa..76cf8bbf 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 85ba4f67..8848306f 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 333237a2..2bee211d 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 7deb1fe6..d2a03682 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 35d0b9a1..41da8bf3 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 3022d1c2..aac0320e 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 365c6dae..9790c035 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 25707c82..84a37285 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index c4d4adda..a280b46c 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 26096178..c3a8a631 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 22828185..a2516fef 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 3455d158..bb7225d1 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index e79a93ef..fd48a055 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 26c89efc..c785e175 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index a45edfe5..77092c24 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 9a6d5a6a..5349aee0 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 2d372685..365e0f7e 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 8ff5b75c..175605c8 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 960efcf4..4c850869 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index bc6c1b33..789ae5b6 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231120 + 3.2.806-preview20231122 readme.md From 5260c856a333832149577b965891eec368b7fcc7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 20:14:01 +0800 Subject: [PATCH 3/6] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IAsTable=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E8=A1=A8=E6=94=AF=E6=8C=81=E4=B8=8D?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=97=B6=E9=97=B4=E9=97=B4=E9=9A=94=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 267 ++++++++++------------ FreeSql/DataAnnotations/TableAttribute.cs | 22 +- FreeSql/FreeSql.xml | 98 ++++++++ 3 files changed, 227 insertions(+), 160 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 3ce4b208..5b8532ae 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -109,7 +109,7 @@ namespace base_entity public B B { get; set; } } - [Table(Name = "as_table_log_{yyyyMMddHH}", AsTable = "createtime=2022-1-1 11(1 month)")] + [Table(Name = "as_table_log_{yyyyMMddHH}", AsTable = "createtime=2022-1-1 11(12,1 month)")] class AsTableLog { public Guid id { get; set; } @@ -589,7 +589,7 @@ namespace base_entity //.UseConnectionString(DataType.ClickHouse, "DataCompress=False;BufferSize=32768;SocketTimeout=10000;CheckCompressedHash=False;Encrypt=False;Compressor=lz4;Host=192.168.0.121;Port=8125;Database=PersonnelLocation;Username=root;Password=123") .UseMonitorCommand(cmd => { - //Console.WriteLine(cmd.CommandText + "\r\n"); + Console.WriteLine(cmd.CommandText + "\r\n"); //cmd.CommandText = null; //不执行 //if (cmd.CommandText.StartsWith("")) @@ -599,43 +599,122 @@ namespace base_entity .Build(); BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion - fsql.Select().First(); - var running = true; - for (var a = 0; a < 100; a++) - { - new Thread(() => - { - while (running) - { - try - { - fsql.Select().First(); - } - catch(Exception ex) - { - Console.WriteLine(ex.Message); - } - Task.Run(async () => - { - try - { - await fsql.Select().FirstAsync(); - } - catch (Exception ex) - { - Console.WriteLine("Async:" + ex.Message); - } - }); - } - }).Start(); - } - Console.ReadKey(); - running = false; - fsql.Dispose(); - return; + fsql.Select().Where(a => a.createtime > DateTime.Now && a.createtime < DateTime.Now.AddMonths(1)).ToList(); + //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); + //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); - var x01sql01 = fsql.Select() + var testitems = new[] + { + new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, + new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 }, + new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 }, + new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 }, + new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 }, + new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 }, + new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 }, + new AsTableLog{ msg = "msg08", createtime = DateTime.Parse("2022-7-1"), click = 9}, + new AsTableLog{ msg = "msg09", createtime = DateTime.Parse("2022-7-1 11:00:00"), click = 10}, + new AsTableLog{ msg = "msg10", createtime = DateTime.Parse("2022-7-1 12:00:00"), click = 10} + }; + var sqlatb = fsql.Insert(testitems).NoneParameter(); + var sqlat = sqlatb.ToSql(); + var sqlatr = sqlatb.ExecuteAffrows(); + + //var sqlatc1 = fsql.Delete().Where(a => a.click < 0); + //var sqlatca1 = sqlatc1.ToSql(); + //var sqlatcr1 = sqlatc1.ExecuteAffrows(); + + var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); + var sqlatca1 = sqlatc1.ToSql(); + var sqlatcr1 = sqlatc1.ExecuteAffrows(); + + var sqlatc2 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2021-3-8 15:00:13")); + var sqlatca2 = sqlatc2.ToSql(); + var sqlatcr2 = sqlatc2.ExecuteAffrows(); + + var sqlatc = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqlatca = sqlatc.ToSql(); + var sqlatcr = sqlatc.ExecuteAffrows(); + + var sqlatd1 = fsql.Update().SetSource(testitems[0]); + var sqlatd101 = sqlatd1.ToSql(); + var sqlatd102 = sqlatd1.ExecuteAffrows(); + + var sqlatd2 = fsql.Update().SetSource(testitems[5]); + var sqlatd201 = sqlatd2.ToSql(); + var sqlatd202 = sqlatd2.ExecuteAffrows(); + + var sqlatd3 = fsql.Update().SetSource(testitems); + var sqlatd301 = sqlatd3.ToSql(); + var sqlatd302 = sqlatd3.ExecuteAffrows(); + + var sqlatd4 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg"); + var sqlatd401 = sqlatd4.ToSql(); + var sqlatd402 = sqlatd4.ExecuteAffrows(); + + var sqlatd5 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqlatd501 = sqlatd5.ToSql(); + var sqlatd502 = sqlatd5.ExecuteAffrows(); + + var sqlatd6 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); + var sqlatd601 = sqlatd6.ToSql(); + var sqlatd602 = sqlatd6.ExecuteAffrows(); + + var sqlatd7 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1")); + var sqlatd701 = sqlatd7.ToSql(); + var sqlatd702 = sqlatd7.ExecuteAffrows(); + + var sqlatd8 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime < DateTime.Parse("2022-5-1")); + var sqlatd801 = sqlatd8.ToSql(); + var sqlatd802 = sqlatd8.ExecuteAffrows(); + + var sqlatd12 = fsql.InsertOrUpdate().SetSource(testitems[0]); + var sqlatd1201 = sqlatd12.ToSql(); + var sqlatd1202 = sqlatd12.ExecuteAffrows(); + + var sqlatd22 = fsql.InsertOrUpdate().SetSource(testitems[5]); + var sqlatd2201 = sqlatd22.ToSql(); + var sqlatd2202 = sqlatd22.ExecuteAffrows(); + + var sqlatd32 = fsql.InsertOrUpdate().SetSource(testitems); + var sqlatd3201 = sqlatd32.ToSql(); + var sqlatd3202 = sqlatd32.ExecuteAffrows(); + + var sqls1 = fsql.Select().OrderBy(a => a.createtime).Limit(10); + var sqls101 = sqls1.ToSql(); + var sqls102 = sqls1.ToList(); + + var sqls2 = fsql.Select().Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqls201 = sqls2.ToSql(); + var sqls202 = sqls2.ToList(); + + var sqls3 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); + var sqls301 = sqls3.ToSql(); + var sqls302 = sqls3.ToList(); + + var sqls4 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1")); + var sqls401 = sqls4.ToSql(); + var sqls402 = sqls4.ToList(); + + var sqls5 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")); + var sqls501 = sqls5.ToSql(); + var sqls502 = sqls5.ToList(); + + var sqls6 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime); + var sqls601 = sqls6.ToSql(); + var sqls602 = sqls6.ToList(); + + var sqls7 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new + { + sum1 = g.Sum(g.Key.click), + cou1 = g.Count(), + avg1 = g.Avg(g.Key.click), + min = g.Min(g.Key.click), + max = g.Max(g.Key.click) + }); + + var x01sql01 = fsql.Select() .Include(a => a.Test1) .Include(a => a.Test2) .Include(a => a.Test3) @@ -763,7 +842,6 @@ namespace base_entity title = "one plus pro" }.Save(); - fsql.Select().Where(a => a.createtime > DateTime.Now && a.createtime < DateTime.Now.AddMonths(1)).ToList(); using (var uow = fsql.CreateUnitOfWork()) { @@ -914,118 +992,7 @@ namespace base_entity .ToSql(); - //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); - //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); - - var testitems = new[] - { - new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, - new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 }, - new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 }, - new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 }, - new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 }, - new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 }, - new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 }, - new AsTableLog{ msg = "msg08", createtime = DateTime.Parse("2022-7-1"), click = 9}, - new AsTableLog{ msg = "msg09", createtime = DateTime.Parse("2022-7-1 11:00:00"), click = 10}, - new AsTableLog{ msg = "msg10", createtime = DateTime.Parse("2022-7-1 12:00:00"), click = 10} - }; - var sqlatb = fsql.Insert(testitems).NoneParameter(); - var sqlat = sqlatb.ToSql(); - var sqlatr = sqlatb.ExecuteAffrows(); - - //var sqlatc1 = fsql.Delete().Where(a => a.click < 0); - //var sqlatca1 = sqlatc1.ToSql(); - //var sqlatcr1 = sqlatc1.ExecuteAffrows(); - - var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); - var sqlatca1 = sqlatc1.ToSql(); - var sqlatcr1 = sqlatc1.ExecuteAffrows(); - - var sqlatc2 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2021-3-8 15:00:13")); - var sqlatca2 = sqlatc2.ToSql(); - var sqlatcr2 = sqlatc2.ExecuteAffrows(); - - var sqlatc = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqlatca = sqlatc.ToSql(); - var sqlatcr = sqlatc.ExecuteAffrows(); - - var sqlatd1 = fsql.Update().SetSource(testitems[0]); - var sqlatd101 = sqlatd1.ToSql(); - var sqlatd102 = sqlatd1.ExecuteAffrows(); - - var sqlatd2 = fsql.Update().SetSource(testitems[5]); - var sqlatd201 = sqlatd2.ToSql(); - var sqlatd202 = sqlatd2.ExecuteAffrows(); - - var sqlatd3 = fsql.Update().SetSource(testitems); - var sqlatd301 = sqlatd3.ToSql(); - var sqlatd302 = sqlatd3.ExecuteAffrows(); - - var sqlatd4 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg"); - var sqlatd401 = sqlatd4.ToSql(); - var sqlatd402 = sqlatd4.ExecuteAffrows(); - - var sqlatd5 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqlatd501 = sqlatd5.ToSql(); - var sqlatd502 = sqlatd5.ExecuteAffrows(); - - var sqlatd6 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); - var sqlatd601 = sqlatd6.ToSql(); - var sqlatd602 = sqlatd6.ExecuteAffrows(); - - var sqlatd7 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1")); - var sqlatd701 = sqlatd7.ToSql(); - var sqlatd702 = sqlatd7.ExecuteAffrows(); - - var sqlatd8 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime < DateTime.Parse("2022-5-1")); - var sqlatd801 = sqlatd8.ToSql(); - var sqlatd802 = sqlatd8.ExecuteAffrows(); - - var sqlatd12 = fsql.InsertOrUpdate().SetSource(testitems[0]); - var sqlatd1201 = sqlatd12.ToSql(); - var sqlatd1202 = sqlatd12.ExecuteAffrows(); - - var sqlatd22 = fsql.InsertOrUpdate().SetSource(testitems[5]); - var sqlatd2201 = sqlatd22.ToSql(); - var sqlatd2202 = sqlatd22.ExecuteAffrows(); - - var sqlatd32 = fsql.InsertOrUpdate().SetSource(testitems); - var sqlatd3201 = sqlatd32.ToSql(); - var sqlatd3202 = sqlatd32.ExecuteAffrows(); - - var sqls1 = fsql.Select().OrderBy(a => a.createtime); - var sqls101 = sqls1.ToSql(); - var sqls102 = sqls1.ToList(); - - var sqls2 = fsql.Select().Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqls201 = sqls2.ToSql(); - var sqls202 = sqls2.ToList(); - - var sqls3 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); - var sqls301 = sqls3.ToSql(); - var sqls302 = sqls3.ToList(); - - var sqls4 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1")); - var sqls401 = sqls4.ToSql(); - var sqls402 = sqls4.ToList(); - - var sqls5 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")); - var sqls501 = sqls5.ToSql(); - var sqls502 = sqls5.ToList(); - - var sqls6 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime); - var sqls601 = sqls6.ToSql(); - var sqls602 = sqls6.ToList(); - - var sqls7 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new - { - sum1 = g.Sum(g.Key.click), - cou1 = g.Count(), - avg1 = g.Avg(g.Key.click), - min = g.Min(g.Key.click), - max = g.Max(g.Key.click) - }); + var iouSetSql01 = fsql.InsertOrUpdate() diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index 5f668e90..cb2f5f74 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -45,7 +45,7 @@ namespace FreeSql.DataAnnotations { if (string.IsNullOrEmpty(AsTable) == false) { - var atm = Regex.Match(AsTable, @"([\w_\d]+)\s*=\s*(\d\d\d\d)\s*\-\s*(\d\d?)\s*\-\s*(\d\d?)\s*( [\d:]+)?\((\d+)\s*(year|month|day|hour)\)", RegexOptions.IgnoreCase); + var atm = Regex.Match(AsTable, @"([\w_\d]+)\s*=\s*(\d\d\d\d)\s*\-\s*(\d\d?)\s*\-\s*(\d\d?)\s*( [\d:]+)?\(([\d,]+)\s*(year|month|day|hour)\)", RegexOptions.IgnoreCase); if (atm.Success == false) throw new Exception(CoreStrings.AsTable_PropertyName_FormatError(AsTable)); @@ -65,11 +65,12 @@ namespace FreeSql.DataAnnotations else if (hhmmss.Length == 2) beginTime = $"{beginTime} {hhmmss[0]}:{hhmmss[1]}:0"; else if (hhmmss.Length == 3) beginTime = $"{beginTime} {hhmmss[0]}:{hhmmss[1]}:{hhmmss[2]}"; } - int.TryParse(atm.Groups[6].Value, out var atm6); + var intervals = atm.Groups[6].Value.Split(',').Select(a => int.TryParse(a, out var atm6) ? atm6 : 0).Where(a => a > 0).ToArray(); string atm7 = atm.Groups[7].Value.ToLower(); - tb.AsTableImpl = new DateTimeAsTableImpl(Name, DateTime.Parse(beginTime), dt => + tb.AsTableImpl = new DateTimeAsTableImpl(Name, DateTime.Parse(beginTime), (dt, idx) => { - switch (atm7) + var atm6 = idx >= 0 && idx < intervals.Length ? intervals[idx] : intervals.Last(); + switch (atm7) { case "year": return dt.AddYears(atm6); case "month": return dt.AddMonths(atm6); @@ -89,19 +90,19 @@ namespace FreeSql.DataAnnotations string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2); string[] GetTableNamesBySqlWhere(string sqlWhere, List dbParams, SelectTableInfo tb, CommonUtils commonUtils); } - class DateTimeAsTableImpl : IAsTable + class DateTimeAsTableImpl : IAsTable { readonly object _lock = new object(); readonly List _allTables = new List(); readonly List _allTablesTime = new List(); readonly DateTime _beginTime; DateTime _lastTime; - Func _nextTimeFunc; + Func _nextTimeFunc; string _tableName; Match _tableNameFormat; static Regex _regTableNameFormat = new Regex(@"\{([^\\}]+)\}"); - public DateTimeAsTableImpl(string tableName, DateTime beginTime, Func nextTimeFunc) + public DateTimeAsTableImpl(string tableName, DateTime beginTime, Func nextTimeFunc) { if (nextTimeFunc == null) throw new ArgumentException(CoreStrings.Cannot_Be_NULL_Name("nextTimeFunc")); //beginTime = beginTime.Date; //日期部分作为开始 @@ -116,7 +117,8 @@ namespace FreeSql.DataAnnotations int GetTimestamp(DateTime dt) => (int)dt.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; void ExpandTable(DateTime beginTime, DateTime endTime) { - if (beginTime > endTime) endTime = _nextTimeFunc(beginTime); + var index = 0; + if (beginTime > endTime) endTime = _nextTimeFunc(beginTime, -1); lock (_lock) { while (beginTime <= endTime) @@ -127,7 +129,7 @@ namespace FreeSql.DataAnnotations _allTables.Insert(0, name); _allTablesTime.Insert(0, beginTime); _lastTime = beginTime; - beginTime = _nextTimeFunc(beginTime); + beginTime = _nextTimeFunc(beginTime, index++); } } } @@ -153,7 +155,7 @@ namespace FreeSql.DataAnnotations { var dt = ParseColumnValue(columnValue); if (dt < _beginTime) throw new Exception(CoreStrings.SubTableFieldValue_CannotLessThen(dt.ToString("yyyy-MM-dd HH:mm:ss"), _beginTime.ToString("yyyy-MM-dd HH:mm:ss"))); - var tmpTime = _nextTimeFunc(_lastTime); + var tmpTime = _nextTimeFunc(_lastTime, -1); if (dt >= tmpTime && autoExpand) { // 自动建表 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ea78dcc5..f4a66a58 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1086,6 +1086,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5769,6 +5845,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and From 99c3cd4ff6ed90bbaa28772fd0f4eac530407dc0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 21:52:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IAsTable.SetTableN?= =?UTF-8?q?ame=20=E8=87=AA=E5=AE=9A=E4=B9=89=E5=88=86=E8=A1=A8=E5=90=8D?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/ModAsTableImpl.cs | 5 +++++ Examples/base_entity/Program.cs | 8 ++++++-- FreeSql/DataAnnotations/TableAttribute.cs | 13 +++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Examples/base_entity/ModAsTableImpl.cs b/Examples/base_entity/ModAsTableImpl.cs index 3c802b21..312529e2 100644 --- a/Examples/base_entity/ModAsTableImpl.cs +++ b/Examples/base_entity/ModAsTableImpl.cs @@ -42,4 +42,9 @@ class ModAsTableImpl : IAsTable if (tables.Any() == false) return AllTables; return tables; } + + public IAsTable SetTableName(int index, string tableName) + { + throw new NotImplementedException(); + } } diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 5b8532ae..2dee5906 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -601,8 +601,12 @@ namespace base_entity #endregion fsql.Select().Where(a => a.createtime > DateTime.Now && a.createtime < DateTime.Now.AddMonths(1)).ToList(); - //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); - //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); + //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); + //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); + + fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)).AsTableImpl + .SetTableName(0, "AsTableLog1") + .SetTableName(1, "AsTableLog2"); var testitems = new[] { diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index cb2f5f74..8be8f3c0 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -86,7 +86,8 @@ namespace FreeSql.DataAnnotations public interface IAsTable { string[] AllTables { get; } - string GetTableNameByColumnValue(object columnValue, bool autoExpand = false); + IAsTable SetTableName(int index, string tableName); + string GetTableNameByColumnValue(object columnValue, bool autoExpand = false); string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2); string[] GetTableNamesBySqlWhere(string sqlWhere, List dbParams, SelectTableInfo tb, CommonUtils commonUtils); } @@ -377,5 +378,13 @@ namespace FreeSql.DataAnnotations } } } - } + public IAsTable SetTableName(int index, string tableName) + { + lock (_lock) + { + _allTables[index] = tableName; + } + return this; + } + } } From ae69166654930e2cb9cb0c5152b969130294d2af Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 21:57:58 +0800 Subject: [PATCH 5/6] v3.2.806-preview20231123 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj | 2 +- Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj | 2 +- Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index e93b69a3..9f820d37 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 1a52e189..acb7c33d 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index eb1db916..d08121c9 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 957dfc60..2b4a5ca8 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 29c3317a..e3832081 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 601d8fdd..a53f55ab 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 09ea7bf3..fe72465f 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 517dddfe..4c0fbc46 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 716678fe..5b2c2b93 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index e61b2ce4..d28a5c1c 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 5cb46069..c2ab072d 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 76cf8bbf..46eec9de 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 8848306f..e198e0b9 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 2bee211d..88d0429b 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index d2a03682..8b792e7b 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 41da8bf3..5aa9e19a 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index aac0320e..5299b945 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 9790c035..17888c54 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 84a37285..0bb5a9d1 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index a280b46c..905c1c9d 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index c3a8a631..a4bc786d 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index a2516fef..eb075ba0 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index bb7225d1..fe947e1c 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index fd48a055..5084445b 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index c785e175..570ea67a 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 77092c24..630c169f 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 5349aee0..15e1ec65 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 365e0f7e..2797a103 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 175605c8..b1a6ce69 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 4c850869..5d0c3fbe 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 789ae5b6..420bebe2 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231122 + 3.2.806-preview20231123 readme.md From 9a699c0bfe0be73cc5d3fd88c76e7c9cb8af7498 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 22:21:28 +0800 Subject: [PATCH 6/6] =?UTF-8?q?v3.2.806-preview20231124=20-=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20FluentApi=20AsTable=20=E6=96=B9=E6=B3=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ++++++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/DataAnnotations/TableFluent.cs | 30 +++++++++++++++++-- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 18 +++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 34 files changed, 85 insertions(+), 34 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 9f820d37..f0e011f2 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index acb7c33d..ed544558 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index d08121c9..5cc2dc49 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 2b4a5ca8..75a52325 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index e3832081..b34ea4c2 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index a53f55ab..cdfb70fa 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index fe72465f..38f48ea7 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 4c0fbc46..53ee8f5c 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 5b2c2b93..6f5fce21 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index d28a5c1c..c0e1b82f 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/FreeSql/DataAnnotations/TableFluent.cs b/FreeSql/DataAnnotations/TableFluent.cs index 83f5735c..063e82af 100644 --- a/FreeSql/DataAnnotations/TableFluent.cs +++ b/FreeSql/DataAnnotations/TableFluent.cs @@ -45,8 +45,20 @@ namespace FreeSql.DataAnnotations _table.DisableSyncStructure = value; return this; } + /// + /// 格式:属性名=开始时间(递增) + /// 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] + /// 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] + /// 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] + /// 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] + /// + public TableFluent AsTable(string value) + { + _table.AsTable = value; + return this; + } - public ColumnFluent Property(string proto) + public ColumnFluent Property(string proto) { if (_properties.TryGetValue(proto, out var tryProto) == false) throw new KeyNotFoundException(CoreStrings.NotFound_PropertyName(proto)); var col = _table._columns.GetOrAdd(tryProto.Name, name => new ColumnAttribute { }); @@ -125,9 +137,21 @@ namespace FreeSql.DataAnnotations { _table.DisableSyncStructure = value; return this; - } + } + /// + /// 格式:属性名=开始时间(递增) + /// 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] + /// 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] + /// 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] + /// 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] + /// + public TableFluent AsTable(string value) + { + _table.AsTable = value; + return this; + } - public ColumnFluent Property(Expression> column) + public ColumnFluent Property(Expression> column) { var exp = column?.Body; if (exp?.NodeType == ExpressionType.Convert) exp = (exp as UnaryExpression)?.Operand; diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index c2ab072d..678e62cc 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index f4a66a58..563be88b 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -478,6 +478,15 @@ 禁用 CodeFirst 同步结构迁移 + + + 格式:属性名=开始时间(递增) + 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] + 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] + 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] + 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] + + 导航关系Fluent,与 NavigateAttribute 对应 @@ -511,6 +520,15 @@ 禁用 CodeFirst 同步结构迁移 + + + 格式:属性名=开始时间(递增) + 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] + 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] + 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] + 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] + + 导航关系Fluent,与 NavigateAttribute 对应 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 46eec9de..0b0f221b 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index e198e0b9..8912fc95 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 88d0429b..46529a72 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 8b792e7b..7424eead 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 5aa9e19a..0dc9a124 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 5299b945..6053cfa9 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 17888c54..5467fe20 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 0bb5a9d1..877d00af 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 905c1c9d..4b1b4dd1 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index a4bc786d..449dc268 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index eb075ba0..2212331f 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index fe947e1c..4de62768 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 5084445b..c23e5910 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 570ea67a..d944a542 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 630c169f..dbe19b4b 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 15e1ec65..df16075c 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 2797a103..bd54431d 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index b1a6ce69..5dcc7793 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 5d0c3fbe..505bfe7a 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 420bebe2..5882bf8c 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.806-preview20231123 + 3.2.806-preview20231124 readme.md