增加反向工程的细分开关

This commit is contained in:
智能大石头 2025-04-15 10:27:29 +08:00
parent e5c205d804
commit 12407f8fea
3 changed files with 55 additions and 28 deletions

View File

@ -847,7 +847,7 @@ internal class SQLiteMetaData : FileDbMetaData
/// <returns></returns>
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
/// <param name="entitytable"></param>
/// <param name="dbtable"></param>
/// <param name="mode"></param>
protected override void CheckTable(IDataTable entitytable, IDataTable dbtable, Migration mode)
/// <param name="set"></param>
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)

View File

@ -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<IDataTable>? 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();
if (set.CheckComment)
{
var sql = CheckTableDescription(entitytable, dbtable, mode);
if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql);
}
if (set.CheckDeleteIndex)
{
// 先删除索引,后面才有可能删除字段
sql = CheckDeleteIndex(entitytable, dbtable, mode);
var sql = CheckDeleteIndex(entitytable, dbtable, mode);
if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql);
}
sql = CheckColumnsChange(entitytable, dbtable, @readonly, onlyCreate);
{
var sql = CheckColumnsChange(entitytable, dbtable, @readonly, onlyCreate, set);
if (!sql.IsNullOrEmpty()) Append(sb, ";" + Environment.NewLine, sql);
}
if (set.CheckAddIndex)
{
// 新增字段后,可能需要删除索引
sql = CheckAddIndex(entitytable, dbtable, mode);
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
/// <param name="dbtable"></param>
/// <param name="readonly"></param>
/// <param name="onlyCreate"></param>
/// <param name="set"></param>
/// <returns>返回未执行语句</returns>
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);

View File

@ -73,6 +73,18 @@ public class XCodeSetting : Config<XCodeSetting>
[Description("反向工程。Off 关闭ReadOnly 只读不执行On 打开仅新建Full 完全,修改删除")]
public Migration Migration { get; set; } = Migration.On;
/// <summary>检查注释。表注释或字段注释,反向工程,默认打开</summary>
[Description("检查注释。表注释或字段注释,反向工程,默认打开")]
public Boolean CheckComment { get; set; } = true;
/// <summary>检查删除索引。反向工程,默认打开</summary>
[Description("检查删除索引。反向工程,默认打开")]
public Boolean CheckDeleteIndex { get; set; } = true;
/// <summary>检查添加索引。反向工程,默认打开</summary>
[Description("检查添加索引。反向工程,默认打开")]
public Boolean CheckAddIndex { get; set; } = true;
/// <summary>是否检查索引重复。默认打开</summary>
[Description("检查索引重复。默认打开")]
public Boolean CheckDuplicateIndex { get; set; } = true;