From 12407f8fea483c3e005de0bc9914f14305d5aafe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=BA=E8=83=BD=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Tue, 15 Apr 2025 10:27:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=8D=E5=90=91=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E7=9A=84=E7=BB=86=E5=88=86=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XCode/DataAccessLayer/Database/SQLite.cs | 19 +++---- .../MetaData/DbMetaData_Negative.cs | 52 ++++++++++++------- XCode/Setting.cs | 12 +++++ 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/XCode/DataAccessLayer/Database/SQLite.cs b/XCode/DataAccessLayer/Database/SQLite.cs index 6aa1e9969..655b7d895 100755 --- a/XCode/DataAccessLayer/Database/SQLite.cs +++ b/XCode/DataAccessLayer/Database/SQLite.cs @@ -847,7 +847,7 @@ internal class SQLiteMetaData : FileDbMetaData /// public override String DropIndexSQL(IDataIndex index) => $"Drop Index {index.Name}"; - protected override String CheckColumnsChange(IDataTable entitytable, IDataTable dbtable, Boolean onlySql, Boolean noDelete) + protected override String CheckColumnsChange(IDataTable entitytable, IDataTable dbtable, Boolean onlySql, Boolean noDelete, XCodeSetting set) { foreach (var item in entitytable.Columns) { @@ -864,7 +864,7 @@ internal class SQLiteMetaData : FileDbMetaData } // 把onlySql设为true,让基类只产生语句而不执行 - var sql = base.CheckColumnsChange(entitytable, dbtable, onlySql, true); + var sql = base.CheckColumnsChange(entitytable, dbtable, onlySql, true, set); if (sql.IsNullOrEmpty()) return sql; // SQLite 3.35.0 起支持 Drop Column @@ -879,7 +879,7 @@ internal class SQLiteMetaData : FileDbMetaData Database.CreateSession().Execute(sql); - return null; + return ""; } if (sql.Contains("Drop Column") && v != null && v >= new Version(3, 35)) { @@ -887,11 +887,11 @@ internal class SQLiteMetaData : FileDbMetaData Database.CreateSession().Execute(sql); - return null; + return ""; } var db = Database as DbBase; - using var span = db.Tracer?.NewSpan($"db:{db.ConnName}:SetSchema:RebuildTable", sql); + using var span = db!.Tracer?.NewSpan($"db:{db.ConnName}:SetSchema:RebuildTable", sql); var sql2 = sql; @@ -941,7 +941,7 @@ internal class SQLiteMetaData : FileDbMetaData throw; } - return null; + return ""; } #endregion @@ -965,16 +965,17 @@ internal class SQLiteMetaData : FileDbMetaData /// /// /// - protected override void CheckTable(IDataTable entitytable, IDataTable dbtable, Migration mode) + /// + protected override void CheckTable(IDataTable entitytable, IDataTable? dbtable, Migration mode, XCodeSetting set) { - if (dbtable == null && (Database as SQLite).IsMemoryDatabase) + if (dbtable == null && (Database as SQLite)!.IsMemoryDatabase) { if (memoryTables.Any(t => t.TableName.EqualIgnoreCase(entitytable.TableName))) return; memoryTables.Add(entitytable); } - base.CheckTable(entitytable, dbtable, mode); + base.CheckTable(entitytable, dbtable, mode, set); } protected override Boolean PerformSchema(StringBuilder sb, Boolean onlySql, DDLSchema schema, params Object[] values) diff --git a/XCode/DataAccessLayer/MetaData/DbMetaData_Negative.cs b/XCode/DataAccessLayer/MetaData/DbMetaData_Negative.cs index c64f94137..6cd067b74 100644 --- a/XCode/DataAccessLayer/MetaData/DbMetaData_Negative.cs +++ b/XCode/DataAccessLayer/MetaData/DbMetaData_Negative.cs @@ -69,14 +69,16 @@ internal partial class DbMetaData { if (mode == Migration.Off) return; - OnSetTables(tables, mode); + var set = XCodeSetting.Current; + + OnSetTables(tables, mode, set); } - protected virtual void OnSetTables(IDataTable[] tables, Migration mode) + protected virtual void OnSetTables(IDataTable[] tables, Migration mode, XCodeSetting set) { var dbExist = CheckDatabase(mode); - CheckAllTables(tables, mode, dbExist); + CheckAllTables(tables, mode, dbExist, set); } private Boolean? hasCheckedDatabase; @@ -119,7 +121,7 @@ internal partial class DbMetaData return dbExist; } - private void CheckAllTables(IDataTable[] tables, Migration mode, Boolean dbExit) + private void CheckAllTables(IDataTable[] tables, Migration mode, Boolean dbExit, XCodeSetting set) { IList? dbtables = null; if (dbExit) @@ -141,9 +143,9 @@ internal partial class DbMetaData // 判断指定表是否存在于数据库中,以决定是创建表还是修改表 if (dbtable != null) - CheckTable(item, dbtable, mode); + CheckTable(item, dbtable, mode, set); else - CheckTable(item, null, mode); + CheckTable(item, null, mode, set); } catch (Exception ex) { @@ -152,7 +154,7 @@ internal partial class DbMetaData } } - protected virtual void CheckTable(IDataTable entitytable, IDataTable? dbtable, Migration mode) + protected virtual void CheckTable(IDataTable entitytable, IDataTable? dbtable, Migration mode, XCodeSetting set) { var @readonly = mode <= Migration.ReadOnly; if (dbtable == null) @@ -174,19 +176,30 @@ internal partial class DbMetaData var onlyCreate = mode < Migration.Full; var sb = new StringBuilder(); - var sql = CheckTableDescription(entitytable, dbtable, mode); - if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + if (set.CheckComment) + { + var sql = CheckTableDescription(entitytable, dbtable, mode); + if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + } - // 先删除索引,后面才有可能删除字段 - sql = CheckDeleteIndex(entitytable, dbtable, mode); - if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + if (set.CheckDeleteIndex) + { + // 先删除索引,后面才有可能删除字段 + var sql = CheckDeleteIndex(entitytable, dbtable, mode); + if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + } - sql = CheckColumnsChange(entitytable, dbtable, @readonly, onlyCreate); - if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + { + var sql = CheckColumnsChange(entitytable, dbtable, @readonly, onlyCreate, set); + if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + } - // 新增字段后,可能需要删除索引 - sql = CheckAddIndex(entitytable, dbtable, mode); - if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + if (set.CheckAddIndex) + { + // 新增字段后,可能需要删除索引 + var sql = CheckAddIndex(entitytable, dbtable, mode); + if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql); + } if (sb.Length > 0) WriteLog($"DDL模式[{mode}],请手工修改表[{dbtable.TableName}]:{Environment.NewLine}{sb}"); } @@ -197,8 +210,9 @@ internal partial class DbMetaData /// /// /// + /// /// 返回未执行语句 - protected virtual String CheckColumnsChange(IDataTable entitytable, IDataTable dbtable, Boolean @readonly, Boolean onlyCreate) + protected virtual String CheckColumnsChange(IDataTable entitytable, IDataTable dbtable, Boolean @readonly, Boolean onlyCreate, XCodeSetting set) { var sb = new StringBuilder(); var etdic = entitytable.Columns.ToDictionary(e => FormatName(e), e => e, StringComparer.OrdinalIgnoreCase); @@ -279,7 +293,7 @@ internal partial class DbMetaData PerformSchema(sb, @readonly || onlyCreate, DDLSchema.AlterColumn, item, dbf); //if (item.Description + "" != dbf.Description + "") - if (FormatDescription(item.Description) != FormatDescription(dbf.Description)) + if (set.CheckComment && FormatDescription(item.Description) != FormatDescription(dbf.Description)) { // 先删除旧注释 //if (dbf.Description != null) PerformSchema(sb, noDelete, DDLSchema.DropColumnDescription, dbf); diff --git a/XCode/Setting.cs b/XCode/Setting.cs index 21a663368..323b25164 100644 --- a/XCode/Setting.cs +++ b/XCode/Setting.cs @@ -73,6 +73,18 @@ public class XCodeSetting : Config [Description("反向工程。Off 关闭;ReadOnly 只读不执行;On 打开,仅新建;Full 完全,修改删除")] public Migration Migration { get; set; } = Migration.On; + /// 检查注释。表注释或字段注释,反向工程,默认打开 + [Description("检查注释。表注释或字段注释,反向工程,默认打开")] + public Boolean CheckComment { get; set; } = true; + + /// 检查删除索引。反向工程,默认打开 + [Description("检查删除索引。反向工程,默认打开")] + public Boolean CheckDeleteIndex { get; set; } = true; + + /// 检查添加索引。反向工程,默认打开 + [Description("检查添加索引。反向工程,默认打开")] + public Boolean CheckAddIndex { get; set; } = true; + /// 是否检查索引重复。默认打开 [Description("检查索引重复。默认打开")] public Boolean CheckDuplicateIndex { get; set; } = true;