diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs index 213fb038..fa8f9669 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity.cs @@ -30,6 +30,7 @@ namespace FreeSql /// /// 主键 /// + [Column(Position = 1)] public virtual TKey Id { get; set; } /// diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index 21d35c1f..365ae1b0 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -42,18 +42,22 @@ namespace FreeSql /// /// 创建时间 /// + [Column(Position = -4)] public DateTime CreateTime { get; set; } /// /// 更新时间 /// + [Column(Position = -3)] public DateTime UpdateTime { get; set; } /// /// 逻辑删除 /// + [Column(Position = -2)] public bool IsDeleted { get; set; } /// /// 排序 /// + [Column(Position = -1)] public int Sort { get; set; } /// diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index dc2300e2..11a2d1c1 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -79,5 +79,17 @@ namespace FreeSql.DataAnnotations /// 类型映射,比如:可将 enum 属性映射成 typeof(string) /// public Type MapType { get; set; } - } + + internal short? _Position; + /// + /// 创建表时字段位置,规则如下: + /// + /// >0时排前面,1,2,3... + /// + /// =0时排中间(默认) + /// + /// <0时排后面,...-3,-2,-1 + /// + public short Position { get => _Position ?? 0; set => _Position = value; } +} } diff --git a/FreeSql/DataAnnotations/ColumnFluent.cs b/FreeSql/DataAnnotations/ColumnFluent.cs index 67b3d885..bd731374 100644 --- a/FreeSql/DataAnnotations/ColumnFluent.cs +++ b/FreeSql/DataAnnotations/ColumnFluent.cs @@ -89,11 +89,28 @@ namespace FreeSql.DataAnnotations /// /// 类型映射,比如:可将 enum 属性映射成 typeof(string) /// - /// + /// /// - public ColumnFluent MapType(Type type) + public ColumnFluent MapType(Type value) { - _column.MapType = type; + _column.MapType = value; + return this; + } + + /// + /// 创建表时字段位置,规则如下: + /// + /// >0时排前面 + /// + /// =0时排中间(默认) + /// + /// <0时排后面 + /// + /// + /// + public ColumnFluent Position(short value) + { + _column.Position = value; return this; } } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index dc1ed173..37ba8ffe 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -59,6 +59,17 @@ 类型映射,比如:可将 enum 属性映射成 typeof(string) + + + 创建表时字段位置,规则如下: + + >0时排前面,1,2,3... + + =0时排中间(默认) + + <0时排后面,...-3,-2,-1 + + 数据库列名 @@ -110,7 +121,20 @@ 类型映射,比如:可将 enum 属性映射成 typeof(string) - + + + + + + 创建表时字段位置,规则如下: + + >0时排前面 + + =0时排中间(默认) + + <0时排后面 + + diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 39aa7f7a..84c90381 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -126,6 +126,7 @@ namespace FreeSql.Internal if (trycol._IsVersion != null) attr._IsVersion = trycol.IsVersion; if (trycol._Uniques != null) attr._Uniques = trycol._Uniques; if (trycol.MapType != null) attr.MapType = trycol.MapType; + if (trycol._Position != null) attr._Position = trycol.Position; if (trycol.DbDefautValue != null) attr.DbDefautValue = trycol.DbDefautValue; } var attrs = proto.GetCustomAttributes(typeof(ColumnAttribute), false); @@ -143,6 +144,7 @@ namespace FreeSql.Internal if (tryattr._IsVersion != null) attr._IsVersion = tryattr.IsVersion; if (tryattr._Uniques != null) attr._Uniques = tryattr._Uniques; if (tryattr.MapType != null) attr.MapType = tryattr.MapType; + if (tryattr._Position != null) attr._Position = tryattr.Position; if (tryattr.DbDefautValue != null) attr.DbDefautValue = tryattr.DbDefautValue; } ColumnAttribute ret = null; @@ -156,6 +158,7 @@ namespace FreeSql.Internal if (attr._IsVersion != null) ret = attr; if (attr._Uniques != null) ret = attr; if (attr.MapType != null) ret = attr; + if (attr._Position != null) ret = attr; if (attr.DbDefautValue != null) ret = attr; if (ret != null && ret.MapType == null) ret.MapType = proto.PropertyType; return ret; diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs index d1b5bb90..1e1b3da8 100644 --- a/FreeSql/Internal/Model/TableInfo.cs +++ b/FreeSql/Internal/Model/TableInfo.cs @@ -14,6 +14,7 @@ namespace FreeSql.Internal.Model public Dictionary Columns { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary ColumnsByCs { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary ColumnsByCsIgnore { get; set; } = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + public ColumnInfo[] ColumnsByPosition { get; set; } public ColumnInfo[] Primarys { get; set; } public Dictionary> Uniques { get; set; } public string CsName { get; set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index d4a2cc21..e1c23f47 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -70,6 +70,7 @@ namespace FreeSql.Internal var propsLazy = new List<(PropertyInfo, bool, bool)>(); var propsNavObjs = new List(); var propsComment = CommonUtils.GetProperyCommentBySummary(entity); + var columnsList = new List(); foreach (var p in trytb.Properties.Values) { var setMethod = trytb.Type.GetMethod($"set_{p.Name}"); @@ -169,6 +170,7 @@ namespace FreeSql.Internal 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) @@ -241,6 +243,9 @@ namespace FreeSql.Internal } var allunique = trytb.Columns.Values.Where(a => a.Attribute._Uniques != null).SelectMany(a => a.Attribute._Uniques).Distinct(); trytb.Uniques = allunique.ToDictionary(a => a, a => trytb.Columns.Values.Where(b => b.Attribute._Uniques != null && b.Attribute._Uniques.Contains(a)).ToList()); + 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(); tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb); #region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类 diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index f4c5acc0..ae762748 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -132,7 +132,7 @@ namespace FreeSql.MySql { //创建表 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -197,7 +197,7 @@ where a.table_schema in ({0}) and a.table_name in ({1})", tboldname ?? tbname); if (istmpatler == false) { var existsPrimary = ExecuteScalar(tbname[0], _commonUtils.FormatSql("select 1 from information_schema.key_column_usage where table_schema={0} and table_name={1} and constraint_name = 'PRIMARY' limit 1", tbname)); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var isIdentityChanged = tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("AUTO_INCREMENT", StringComparison.CurrentCultureIgnoreCase) == -1; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || @@ -263,7 +263,7 @@ where a.constraint_schema IN ({0}) and a.table_name IN ({1})", tboldname ?? tbna var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); //创建临时表 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -286,10 +286,10 @@ where a.constraint_schema IN ({0}) and a.table_name IN ({1})", tboldname ?? tbna sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) Engine=InnoDB;\r\n"); sb.Append("INSERT INTO ").Append(tmptablename).Append(" ("); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append(")\r\nSELECT "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var insertvalue = "NULL"; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index daf4d3f4..51901c67 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -110,7 +110,7 @@ namespace FreeSql.Oracle { //创建表 sb.Append("execute immediate 'CREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -131,7 +131,7 @@ namespace FreeSql.Oracle sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) \r\nLOGGING \r\nNOCOMPRESS \r\nNOCACHE\r\n';\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) sb.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment).Replace("'", "''")).Append("';\r\n"); @@ -182,7 +182,7 @@ where a.owner={{0}} and a.table_name={{1}}", tboldname ?? tbname); if (istmpatler == false) { - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var dbtypeNoneNotNull = Regex.Replace(tbcol.Attribute.DbType, @"NOT\s+NULL", "NULL"); if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || @@ -264,7 +264,7 @@ and a.owner in ({0}) and a.table_name in ({1})", tboldname ?? tbname); var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}"); //创建临时表 sb.Append("execute immediate 'CREATE TABLE ").Append(tmptablename).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -285,16 +285,16 @@ and a.owner in ({0}) and a.table_name in ({1})", tboldname ?? tbname); sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) LOGGING \r\nNOCOMPRESS \r\nNOCACHE\r\n';\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) sb.Append("execute immediate 'COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment).Replace("'", "''")).Append("';\r\n"); } sb.Append("execute immediate 'INSERT INTO ").Append(tmptablename).Append(" ("); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append(")\r\nSELECT "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var insertvalue = "NULL"; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs index 78742220..6678ba40 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs @@ -151,7 +151,7 @@ namespace FreeSql.PostgreSQL { //创建表 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -171,7 +171,7 @@ namespace FreeSql.PostgreSQL sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) WITH (OIDS=FALSE);\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) sb.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n"); @@ -242,7 +242,7 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname); if (istmpatler == false) { - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || string.IsNullOrEmpty(tbcol.Attribute.OldName) == false && tbstruct.TryGetValue(tbcol.Attribute.OldName, out tbstructcol)) @@ -311,7 +311,7 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); //创建临时表 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -331,16 +331,16 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) WITH (OIDS=FALSE);\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) sb.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n"); } sb.Append("INSERT INTO ").Append(tmptablename).Append(" ("); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append(")\r\nSELECT "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var insertvalue = "NULL"; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index ea78f7f4..e0b0d18d 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -162,7 +162,7 @@ ELSE //创建新表 sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(" ( "); var pkidx = 0; - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -188,7 +188,7 @@ ELSE } sb.Remove(sb.Length - 1, 1).Append("\r\n);\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) AddOrUpdateMS_Description(sb, tbname[1], tbname[2], tbcol.Attribute.Name, tbcol.Comment); @@ -242,7 +242,7 @@ use " + database, tboldname ?? tbname); if (istmpatler == false) { - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || string.IsNullOrEmpty(tbcol.Attribute.OldName) == false && tbstruct.TryGetValue(tbcol.Attribute.OldName, out tbstructcol)) @@ -321,7 +321,7 @@ use " + database, tboldname ?? tbname); //创建临时表 sb.Append("CREATE TABLE ").Append(tmptablename).Append(" ( "); var pkidx2 = 0; - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -348,7 +348,7 @@ use " + database, tboldname ?? tbname); } sb.Remove(sb.Length - 1, 1).Append("\r\n);\r\n"); //备注 - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { if (string.IsNullOrEmpty(tbcol.Comment) == false) AddOrUpdateMS_Description(sb, tbname[1], $"FreeSqlTmp_{tbname[2]}", tbcol.Attribute.Name, tbcol.Comment); @@ -357,10 +357,10 @@ use " + database, tboldname ?? tbname); if (idents) sb.Append("SET IDENTITY_INSERT ").Append(tmptablename).Append(" ON;\r\n"); sb.Append("IF EXISTS(SELECT 1 FROM ").Append(tablename).Append(")\r\n"); sb.Append("\tEXEC('INSERT INTO ").Append(tmptablename).Append(" ("); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append(")\r\n\t\tSELECT "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var insertvalue = "NULL"; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs index 85d684d4..7ab66263 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs @@ -100,7 +100,7 @@ namespace FreeSql.Sqlite { //创建表 sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -163,7 +163,7 @@ namespace FreeSql.Sqlite if (istmpatler == false) { - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var dbtypeNoneNotNull = Regex.Replace(tbcol.Attribute.DbType, @"NOT\s+NULL", "NULL"); if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) || @@ -217,7 +217,7 @@ namespace FreeSql.Sqlite //创建表 isIndent = false; sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -243,10 +243,10 @@ namespace FreeSql.Sqlite sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) \r\n;\r\n"); sb.Append("INSERT INTO ").Append(tmptablename).Append(" ("); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append(")\r\nSELECT "); - foreach (var tbcol in tb.Columns.Values) + foreach (var tbcol in tb.ColumnsByPosition) { var insertvalue = "NULL"; if (tbstruct.TryGetValue(tbcol.Attribute.Name, out var tbstructcol) ||