Kaynağa Gözat

😁调整数据库连接配置,增加表、种子增量更新配置及其他优化

zuohuaijun 2 yıl önce
ebeveyn
işleme
6bef0a2af9

+ 28 - 12
Admin.NET/Admin.NET.Application/Configuration/Database.json

@@ -1,28 +1,44 @@
 {
   "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
 
+  // 具体配置见SqlSugar官网(第一个为默认库不需要设置ConfigId)
   "DbConnection": {
-    // 具体配置见SqlSugar官网(第一个为默认库不需要设置ConfigId)
     "ConnectionConfigs": [
       {
         "DbType": "Sqlite", // MySql、SqlServer、Sqlite、Oracle、PostgreSQL、Dm、Kdbndp、Oscar、MySqlConnector、Access、OpenGauss、QuestDB、HG、ClickHouse、GBase、Odbc、Custom
         "ConnectionString": "DataSource=./Admin.NET.db", // 库连接字符串
-        "EnableInitDb": true, // 启用库表初始化
-        "EnableInitSeed": true, // 启用种子初始化
-        "EnableIncreTable": false, // 启用增量表更新
-        "EnableDiffLog": false, // 启用库表差异日志
-        "EnableUnderLine": false // 启用驼峰转下划线
+        "DbSettings": {
+          "EnableInitDb": true, // 启用库初始化
+          "EnableDiffLog": false, // 启用库表差异日志
+          "EnableUnderLine": false // 启用驼峰转下划线
+        },
+        "TableSettings": {
+          "EnableInitTable": true, // 启用表初始化
+          "EnableIncreTable": false // 启用表增量更新
+        },
+        "SeedSettings": {
+          "EnableInitSeed": true, // 启用种子初始化
+          "EnableIncreSeed": false // 启用种子增量更新
+        }
       }
       //// 其他数据库配置(可以配置多个)
       //{
-      //    "ConfigId": "test",
-      //    "DbType": "Sqlite",
-      //    "ConnectionString": "DataSource=./test.db", // 库连接字符串
-      //    "EnableInitDb": true, // 启用库表初始化
-      //    "EnableInitSeed": true, // 启用种子初始化
-      //    "EnableIncreTable": false, // 启用增量表更新
+      //  "ConfigId": "test", // 库标识
+      //  "DbType": "Sqlite", // 库类型
+      //  "ConnectionString": "DataSource=./test.db", // 库连接字符串
+      //  "DbSettings": {
+      //    "EnableInitDb": true, // 启用库初始化
       //    "EnableDiffLog": false, // 启用库表差异日志
       //    "EnableUnderLine": false // 启用驼峰转下划线
+      //  },
+      //  "TableSettings": {
+      //    "EnableInitTable": true, // 启用表初始化
+      //    "EnableIncreTable": false // 启用表增量更新
+      //  },
+      //  "SeedSettings": {
+      //    "EnableInitSeed": true, // 启用种子初始化
+      //    "EnableIncreSeed": false // 启用种子增量更新
+      //  }
       //}
     ]
   }

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -23,7 +23,7 @@
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.8.40" />
     <PackageReference Include="Furion.Pure" Version="4.8.8.40" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
-    <PackageReference Include="Lazy.Captcha.Core" Version="2.0.3" />
+    <PackageReference Include="Lazy.Captcha.Core" Version="2.0.4" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.5" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.5" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.20" />

+ 18 - 18
Admin.NET/Admin.NET.Core/Attribute/IgnoreUpdateAttribute.cs → Admin.NET/Admin.NET.Core/Attribute/IncreSeedAttribute.cs

@@ -1,19 +1,19 @@
-// 麻省理工学院许可证
-//
-// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
-//
-// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
-//
-// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
-// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
-
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 忽略更新种子数据特性
-/// </summary>
-[SuppressSniffer]
-[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
-public class IgnoreUpdateAttribute : Attribute
-{
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 增量种子特性
+/// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
+public class IncreSeedAttribute : Attribute
+{
 }

+ 52 - 6
Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs

@@ -29,22 +29,36 @@ public sealed class DbConnectionOptions : IConfigurableOptions<DbConnectionOptio
     }
 }
 
+/// <summary>
+/// 数据库连接配置
+/// </summary>
 public sealed class DbConnectionConfig : ConnectionConfig
 {
     /// <summary>
-    /// 启用库表初始化
+    /// 数据库设置
     /// </summary>
-    public bool EnableInitDb { get; set; }
+    public DbSettings DbSettings { get; set; }
 
     /// <summary>
-    /// 启用种子初始化
+    /// 表设置
     /// </summary>
-    public bool EnableInitSeed { get; set; }
+    public TableSettings TableSettings { get; set; }
 
     /// <summary>
-    /// 启用增量表更新
+    /// 种子设置
     /// </summary>
-    public bool EnableIncreTable { get; set; }
+    public SeedSettings SeedSettings { get; set; }
+}
+
+/// <summary>
+/// 数据库设置
+/// </summary>
+public sealed class DbSettings
+{
+    /// <summary>
+    /// 启用库表初始化
+    /// </summary>
+    public bool EnableInitDb { get; set; }
 
     /// <summary>
     /// 启用库表差异日志
@@ -55,4 +69,36 @@ public sealed class DbConnectionConfig : ConnectionConfig
     /// 启用驼峰转下划线
     /// </summary>
     public bool EnableUnderLine { get; set; }
+}
+
+/// <summary>
+/// 表设置
+/// </summary>
+public sealed class TableSettings
+{
+    /// <summary>
+    /// 启用表初始化
+    /// </summary>
+    public bool EnableInitTable { get; set; }
+
+    /// <summary>
+    /// 启用表增量更新
+    /// </summary>
+    public bool EnableIncreTable { get; set; }
+}
+
+/// <summary>
+/// 种子设置
+/// </summary>
+public sealed class SeedSettings
+{
+    /// <summary>
+    /// 启用种子初始化
+    /// </summary>
+    public bool EnableInitSeed { get; set; }
+
+    /// <summary>
+    /// 启用种子增量更新
+    /// </summary>
+    public bool EnableIncreSeed { get; set; }
 }

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs

@@ -18,7 +18,6 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysConfig> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysDictDataSeedData.cs

@@ -18,7 +18,6 @@ public class SysDictDataSeedData : ISqlSugarEntitySeedData<SysDictData>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysDictData> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysDictTypeSeedData.cs

@@ -18,7 +18,6 @@ public class SysDictTypeSeedData : ISqlSugarEntitySeedData<SysDictType>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysDictType> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -18,7 +18,6 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysMenu> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysOrgSeedData.cs

@@ -18,7 +18,6 @@ public class SysOrgSeedData : ISqlSugarEntitySeedData<SysOrg>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysOrg> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysPosSeedData.cs

@@ -18,7 +18,6 @@ public class SysPosSeedData : ISqlSugarEntitySeedData<SysPos>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysPos> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs

@@ -18,7 +18,6 @@ public class SysRoleMenuSeedData : ISqlSugarEntitySeedData<SysRoleMenu>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysRoleMenu> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysRoleSeedData.cs

@@ -18,7 +18,6 @@ public class SysRoleSeedData : ISqlSugarEntitySeedData<SysRole>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysRole> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysTenantSeedData.cs

@@ -18,7 +18,6 @@ public class SysTenantSeedData : ISqlSugarEntitySeedData<SysTenant>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysTenant> HasData()
     {
         var defaultDbConfig = App.GetOptions<DbConnectionOptions>().ConnectionConfigs[0];

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysUserExtOrgSeedData.cs

@@ -18,7 +18,6 @@ public class SysUserExtOrgSeedData : ISqlSugarEntitySeedData<SysUserExtOrg>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysUserExtOrg> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysUserRoleSeedData.cs

@@ -18,7 +18,6 @@ public class SysUserRoleSeedData : ISqlSugarEntitySeedData<SysUserRole>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysUserRole> HasData()
     {
         return new[]

+ 0 - 1
Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs

@@ -18,7 +18,6 @@ public class SysUserSeedData : ISqlSugarEntitySeedData<SysUser>
     /// 种子数据
     /// </summary>
     /// <returns></returns>
-    [IgnoreUpdate]
     public IEnumerable<SysUser> HasData()
     {
         var encryptPasswod = CryptogramUtil.Encrypt("123456");

+ 8 - 8
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -145,7 +145,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var tableOutputList = new List<TableOutput>();
         foreach (var item in entityInfos)
         {
-            var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower() == (config.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower());
+            var table = dbTableInfos.FirstOrDefault(x => x.Name.ToLower() == (config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower());
             if (table == null) continue;
             tableOutputList.Add(new TableOutput
             {
@@ -183,7 +183,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
         return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput
         {
-            ColumnName = config.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
+            ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
             ColumnKey = u.IsPrimarykey.ToString(),
             DataType = u.DataType.ToString(),
             NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
@@ -205,12 +205,12 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var provider = _db.AsTenant().GetConnectionScope(!string.IsNullOrEmpty(input.ConfigId) ? input.ConfigId : SqlSugarConst.ConfigId);
 
         var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == input.ConfigId);
-        var dbTableName = config.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName;
+        var dbTableName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName;
         var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)];
         return provider.DbMaintenance.GetColumnInfosByTableName(dbTableName, false).Select(u => new ColumnOuput
         {
-            //转下划线后的列名 需要转回来
-            ColumnName = config.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
+            // 转下划线后的列名需要转回来
+            ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
             ColumnKey = u.IsPrimarykey.ToString(),
             NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
             DataType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
@@ -236,7 +236,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 types.AddRange(asm.GetExportedTypes().ToList());
             }
         }
-        Func<Attribute[], bool> IsMyAttribute = o =>
+        bool IsMyAttribute(Attribute[] o)
         {
             foreach (Attribute a in o)
             {
@@ -244,7 +244,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                     return true;
             }
             return false;
-        };
+        }
         Type[] cosType = types.Where(o =>
         {
             return IsMyAttribute(Attribute.GetCustomAttributes(o, true));
@@ -507,7 +507,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
                 Path.Combine(templatePath , "manage.js.vm"),
             };
         }
-        else if (input.GenerateType.Substring(1, 1).Contains("2"))
+        else if (input.GenerateType.Substring(1, 1).Contains('2'))
         {
             return new List<string>()
             {

+ 6 - 10
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -141,7 +141,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         {
             columns.Add(new DbColumnInfo
             {
-                DbColumnName = config.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName.Trim()) : m.DbColumnName.Trim(),
+                DbColumnName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName.Trim()) : m.DbColumnName.Trim(),
                 DataType = m.DataType,
                 Length = m.Length,
                 ColumnDescription = m.ColumnDescription,
@@ -160,7 +160,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         db.DbMaintenance.AddTableRemark(input.TableName, input.Description);
         input.DbColumnInfoList.ForEach(m =>
         {
-            m.DbColumnName = config.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName) : m.DbColumnName;
+            m.DbColumnName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(m.DbColumnName) : m.DbColumnName;
             db.DbMaintenance.AddColumnRemark(m.DbColumnName, input.TableName, string.IsNullOrWhiteSpace(m.ColumnDescription) ? m.DbColumnName : m.ColumnDescription);
         });
     }
@@ -209,24 +209,20 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     {
         var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == input.ConfigId);
         input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position;
-        input.EntityName = string.IsNullOrWhiteSpace(input.EntityName) ? (config.EnableUnderLine ? CodeGenUtil.CamelColumnName(input.TableName, null) : input.TableName) : input.EntityName;
+        input.EntityName = string.IsNullOrWhiteSpace(input.EntityName) ? (config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(input.TableName, null) : input.TableName) : input.EntityName;
 
-        string[] dbColumnNames; // = _codeGenOptions.EntityBaseColumn[input.BaseClassName];
-        _codeGenOptions.EntityBaseColumn.TryGetValue(input.BaseClassName, out dbColumnNames);
+        _codeGenOptions.EntityBaseColumn.TryGetValue(input.BaseClassName, out string[] dbColumnNames);
         if (dbColumnNames is null || dbColumnNames is { Length: 0 })
             throw Oops.Oh("基类配置文件不存在此类型");
 
         var templatePath = GetEntityTemplatePath();
         var targetPath = GetEntityTargetPath(input);
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
-        DbTableInfo dbTableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName || m.Name == input.TableName.ToLower());
-        if (dbTableInfo == null)
-            throw Oops.Oh(ErrorCodeEnum.db1001);
-
+        DbTableInfo dbTableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(m => m.Name == input.TableName || m.Name == input.TableName.ToLower()) ?? throw Oops.Oh(ErrorCodeEnum.db1001);
         List<DbColumnInfo> dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false);
         dbColumnInfos.ForEach(u =>
         {
-            u.DbColumnName = config.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, dbColumnNames) : u.DbColumnName; // 转下划线后的列名需要转回来
+            u.DbColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, dbColumnNames) : u.DbColumnName; // 转下划线后的列名需要转回来
             u.DataType = CodeGenUtil.ConvertDataType(u, config.DbType);
         });
         if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase))

+ 6 - 3
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -392,9 +392,12 @@ public class SysTenantService : IDynamicApiController, ITransient
             ConfigId = tenant.Id.ToString(),
             DbType = tenant.DbType,
             ConnectionString = tenant.Connection,
-            EnableInitDb = true,
-            EnableDiffLog = false,
-            EnableUnderLine = defautConfig.EnableUnderLine,
+            DbSettings = new DbSettings()
+            {
+                EnableInitDb = true,
+                EnableDiffLog = false,
+                EnableUnderLine = defautConfig.DbSettings.EnableUnderLine,
+            }
         };
         SqlSugarSetup.InitTenantDatabase(App.GetRequiredService<ISqlSugarClient>().AsTenant(), config);
     }

+ 4 - 1
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarRepository.cs

@@ -56,7 +56,10 @@ public class SqlSugarRepository<T> : SimpleClient<T> where T : class, new()
                 DbType = tenant.DbType,
                 IsAutoCloseConnection = true,
                 ConnectionString = tenant.Connection,
-                EnableUnderLine = mainConnConfig.EnableUnderLine,
+                DbSettings = new DbSettings()
+                {
+                    EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine,
+                }
             };
             iTenant.AddConnection(connectionConfig);
             SqlSugarSetup.SetDbConfig(connectionConfig);

+ 58 - 50
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -62,7 +62,7 @@ public static class SqlSugarSetup
                 // 只处理贴了特性[SugarTable]表
                 if (!type.GetCustomAttributes<SugarTable>().Any())
                     return;
-                if (config.EnableUnderLine && !entity.DbTableName.Contains('_'))
+                if (config.DbSettings.EnableUnderLine && !entity.DbTableName.Contains('_'))
                     entity.DbTableName = UtilMethods.ToUnderLine(entity.DbTableName); // 驼峰转下划线
             },
             EntityService = (type, column) => // 处理列
@@ -72,7 +72,7 @@ public static class SqlSugarSetup
                     return;
                 if (new NullabilityInfoContext().Create(type).WriteState is NullabilityState.Nullable)
                     column.IsNullable = true;
-                if (config.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_'))
+                if (config.DbSettings.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_'))
                     column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线
 
                 if (config.DbType == SqlSugar.DbType.Oracle)
@@ -216,7 +216,7 @@ public static class SqlSugarSetup
     /// <param name="config"></param>
     private static void SetDbDiffLog(SqlSugarScopeProvider db, DbConnectionConfig config)
     {
-        if (!config.EnableDiffLog) return;
+        if (!config.DbSettings.EnableDiffLog) return;
 
         db.Aop.OnDiffLogEvent = async u =>
         {
@@ -247,63 +247,71 @@ public static class SqlSugarSetup
     /// <param name="config"></param>
     private static void InitDatabase(SqlSugarScope db, DbConnectionConfig config)
     {
-        if (!config.EnableInitDb) return;
-
         SqlSugarScopeProvider dbProvider = db.GetConnectionScope(config.ConfigId);
 
-        // 创建数据库
-        if (config.DbType != SqlSugar.DbType.Oracle)
-            dbProvider.DbMaintenance.CreateDatabase();
-
-        // 获取所有实体表-初始化表结构
-        var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false))
-            .WhereIF(config.EnableIncreTable, u => u.IsDefined(typeof(IncreTableAttribute), false)).ToList();
-        if (!entityTypes.Any()) return;
-        foreach (var entityType in entityTypes)
+        // 初始化/创建数据库
+        if (config.DbSettings.EnableInitDb)
         {
-            var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
-            if (tAtt != null && tAtt.configId.ToString() != config.ConfigId) continue;
-            if (tAtt == null && config.ConfigId != SqlSugarConst.ConfigId) continue;
-
-            if (entityType.GetCustomAttribute<SplitTableAttribute>() == null)
-                dbProvider.CodeFirst.InitTables(entityType);
-            else
-                dbProvider.CodeFirst.SplitTables().InitTables(entityType);
+            if (config.DbType != SqlSugar.DbType.Oracle)
+                dbProvider.DbMaintenance.CreateDatabase();
         }
 
-        if (!config.EnableInitSeed) return;
+        // 初始化表结构
+        if (config.TableSettings.EnableInitTable)
+        {
+            var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false))
+                .WhereIF(config.TableSettings.EnableIncreTable, u => u.IsDefined(typeof(IncreTableAttribute), false)).ToList();
+            if (entityTypes.Any())
+            {
+                foreach (var entityType in entityTypes)
+                {
+                    var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                    if (tAtt != null && tAtt.configId.ToString() != config.ConfigId) continue;
+                    if (tAtt == null && config.ConfigId != SqlSugarConst.ConfigId) continue;
+
+                    if (entityType.GetCustomAttribute<SplitTableAttribute>() == null)
+                        dbProvider.CodeFirst.InitTables(entityType);
+                    else
+                        dbProvider.CodeFirst.SplitTables().InitTables(entityType);
+                }
+            }
+        }
 
-        // 获取所有种子配置-初始化数据
-        var seedDataTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass
-            && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>)))).ToList();
-        if (!seedDataTypes.Any()) return;
-        foreach (var seedType in seedDataTypes)
+        // 初始化种子数据
+        if (config.SeedSettings.EnableInitSeed)
         {
-            var instance = Activator.CreateInstance(seedType);
+            var seedDataTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>))))
+                .WhereIF(config.SeedSettings.EnableIncreSeed, u => u.IsDefined(typeof(IncreSeedAttribute), false)).ToList();
+            if (seedDataTypes.Any())
+            {
+                foreach (var seedType in seedDataTypes)
+                {
+                    var instance = Activator.CreateInstance(seedType);
 
-            var hasDataMethod = seedType.GetMethod("HasData");
-            var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast<object>();
-            if (seedData == null) continue;
+                    var hasDataMethod = seedType.GetMethod("HasData");
+                    var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast<object>();
+                    if (seedData == null) continue;
 
-            var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();
-            var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
-            if (tAtt != null && tAtt.configId.ToString() != config.ConfigId) continue;
-            if (tAtt == null && config.ConfigId != SqlSugarConst.ConfigId) continue;
+                    var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();
+                    var tAtt = entityType.GetCustomAttribute<TenantAttribute>();
+                    if (tAtt != null && tAtt.configId.ToString() != config.ConfigId) continue;
+                    if (tAtt == null && config.ConfigId != SqlSugarConst.ConfigId) continue;
 
-            var entityInfo = dbProvider.EntityMaintenance.GetEntityInfo(entityType);
-            if (entityInfo.Columns.Any(u => u.IsPrimarykey))
-            {
-                // 按主键进行批量增加和更新
-                var storage = dbProvider.StorageableByObject(seedData.ToList()).ToStorage();
-                storage.AsInsertable.ExecuteCommand();
-                var ignoreUpdate = hasDataMethod.GetCustomAttribute<IgnoreUpdateAttribute>();
-                if (ignoreUpdate == null) storage.AsUpdateable.ExecuteCommand();
-            }
-            else
-            {
-                // 无主键则只进行插入
-                if (!dbProvider.Queryable(entityInfo.DbTableName, entityInfo.DbTableName).Any())
-                    dbProvider.InsertableByObject(seedData.ToList()).ExecuteCommand();
+                    var entityInfo = dbProvider.EntityMaintenance.GetEntityInfo(entityType);
+                    if (entityInfo.Columns.Any(u => u.IsPrimarykey))
+                    {
+                        // 按主键进行批量增加和更新
+                        var storage = dbProvider.StorageableByObject(seedData.ToList()).ToStorage();
+                        storage.AsInsertable.ExecuteCommand();
+                        storage.AsUpdateable.ExecuteCommand();
+                    }
+                    else
+                    {
+                        // 无主键则只进行插入
+                        if (!dbProvider.Queryable(entityInfo.DbTableName, entityInfo.DbTableName).Any())
+                            dbProvider.InsertableByObject(seedData.ToList()).ExecuteCommand();
+                    }
+                }
             }
         }
     }