From ed5e1df9497d868347d47e0caefe2d19cc95ed85 Mon Sep 17 00:00:00 2001
From: LemonNoCry <ningmengbuku@outlook.com>
Date: Sat, 28 Dec 2024 15:02:05 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=F0=9F=8E=A8=E2=9A=A1=EF=B8=8F?=
 =?UTF-8?q?=E9=87=8D=E5=A4=A7=E6=9B=B4=E6=96=B0:=E5=AE=8C=E5=96=84?=
 =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=81=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

随着日益增多的业务表,每次程序启动要扫描一遍表对比结构,会严重影响启动速度,故此优化

1.增加特性[MigrateVersionAttribute]用于标记Model版本,切记再修改Model结构后,修改版本号以便同步结构
2.增加特性[MigrateAttribute]用于标记是否迁移表,默认迁移
3.统一迁移逻辑,核心类:[MigrateCore.cs],增加表:[TableVersion],记录表版本号同EF逻辑一般
4.统一多表、多库迁移逻辑。例如:业务表A结构迁移,会同步所有租户的结构

迁移核心逻辑:
1.Model标记不迁移->程序不做任何处理 return
2.如果没有标记版本号,默认只会初始化,后续修改表结构也不会同步
3.调整表结构后,修改表版本号,程序启动时对比表[TableVersion]中已经记录的版本号:
   比记录大(>):会同步结构;
   比记录小或等(<=):跳过同步;
---
 Blog.Core.Api/Blog.Core.Api.csproj            |   1 -
 Blog.Core.Api/Blog.Core.Model.xml             | 510 +++++++++---------
 .../Controllers/Systems/DataBaseController.cs |   2 +-
 .../Systems/DynamicCodeFirstController.cs     |   2 +-
 .../Tenant/TenantByDbController.cs            |   1 +
 .../Tenant/TenantByIdController.cs            |   1 +
 .../Tenant/TenantByTableController.cs         |   1 +
 Blog.Core.Common/Blog.Core.Common.csproj      |   1 +
 Blog.Core.Common/DB/Aop/SqlsugarAop.cs        |   4 +-
 Blog.Core.Common/DB/EntityUtility.cs          |   1 +
 Blog.Core.Common/DB/RepositorySetting.cs      |   8 +-
 Blog.Core.Common/DB/TenantUtil.cs             |   2 +-
 Blog.Core.Common/Seed/DBSeed.cs               | 238 ++++----
 .../Seed/SeedData/BusinessDataSeedData.cs     |   1 +
 .../SeedData/MultiBusinessDataSeedData.cs     |   1 +
 .../SeedData/MultiBusinessSubDataSeedData.cs  |   1 +
 .../Seed/SeedData/SubBusinessDataSeedData.cs  |   1 +
 .../Seed/SeedData/TenantSeedData.cs           |   2 +-
 .../HostedService/SeedDataHostedService.cs    |   2 +-
 Blog.Core.IServices/IPayServices.cs           |   1 +
 .../Attributes/DataDictionaryAttribute.cs     |  13 +
 .../Attributes/MigrateAttribute.cs            |  13 +
 .../Attributes/MigrateVersionAttribute.cs     |  21 +
 Blog.Core.Migrate/Blog.Core.Migrate.csproj    |  11 +
 Blog.Core.Migrate/Core/IMigrate.cs            |  13 +
 Blog.Core.Migrate/Core/MigrateCore.cs         |  99 ++++
 Blog.Core.Migrate/Core/TableVersion.cs        |  18 +
 Blog.Core.Model/Base/BaseLog.cs               |   5 +-
 .../{Models => Base}/RootTkey/BaseEntity.cs   |   6 +-
 .../RootTkey/DepartmentRoot.cs                |   6 +-
 .../RootTkey/Interface/IDeleteFilter.cs       |   2 +-
 .../{Models => Base}/RootTkey/ModulesRoot.cs  |   5 +-
 .../RootTkey/PermissionRoot.cs                |   6 +-
 .../RootTkey/RoleModulePermissionRoot.cs      |   5 +-
 .../RootTkey/RootEntityTkey.cs                |   5 +-
 .../RootTkey/TopicDetailRoot.cs               |   4 +-
 .../{Models => Base}/RootTkey/UserRoleRoot.cs |   4 +-
 .../RootTkey/sysUserInfoRoot.cs               |   6 +-
 .../{ => Base}/Tenants/ITenantEntity.cs       |   4 +-
 .../Tenants/MultiTenantAttribute.cs           |   4 +-
 .../{ => Base}/Tenants/TenantTypeEnum.cs      |   2 +-
 Blog.Core.Model/Blog.Core.Model.csproj        |   2 +-
 .../CustomEnums/AuthorityScopeEnum.cs         |   2 +-
 Blog.Core.Model/GlobalUsings.cs               |   9 +
 Blog.Core.Model/HttpEnum.cs                   |   4 +-
 .../IDS4DbModels/ApplicationRole.cs           |   5 +-
 .../IDS4DbModels/ApplicationUser.cs           |   5 +-
 Blog.Core.Model/Logs/AuditSqlLog.cs           |   6 +-
 Blog.Core.Model/Logs/GlobalErrorLog.cs        |   6 +-
 Blog.Core.Model/Logs/GlobalInformationLog.cs  |   6 +-
 Blog.Core.Model/Logs/GlobalWarningLog.cs      |   6 +-
 Blog.Core.Model/Models/AccessTrendLog.cs      |   6 +-
 Blog.Core.Model/Models/Advertisement.cs       |   6 +-
 Blog.Core.Model/Models/BlogArticle.cs         |   7 +-
 Blog.Core.Model/Models/BlogArticleComment.cs  |   5 +-
 Blog.Core.Model/Models/Department.cs          |   7 +-
 Blog.Core.Model/Models/GblLogAudit.cs         |   6 +-
 Blog.Core.Model/Models/Guestbook.cs           |   6 +-
 Blog.Core.Model/Models/Modules.cs             |   6 +-
 Blog.Core.Model/Models/OperateLog.cs          |   6 +-
 Blog.Core.Model/Models/PasswordLib.cs         |   6 +-
 Blog.Core.Model/Models/Permission.cs          |   7 +-
 Blog.Core.Model/Models/Role.cs                |   6 +-
 .../Models/RoleModulePermission.cs            |   6 +-
 Blog.Core.Model/Models/SplitDemo.cs           |   5 +-
 Blog.Core.Model/Models/SysTenant.cs           |   4 +-
 Blog.Core.Model/Models/TasksLog.cs            |   6 +-
 Blog.Core.Model/Models/TasksQz.cs             |   4 +-
 .../Models/Tenant/BusinessTable.cs            |   6 +-
 .../Models/Tenant/MultiBusinessSubTable.cs    |   6 +-
 .../Models/Tenant/MultiBusinessTable.cs       |  14 +-
 .../Models/Tenant/SubLibraryBusinessTable.cs  |  12 +-
 Blog.Core.Model/Models/TestModels.cs          |   2 +-
 Blog.Core.Model/Models/Topic.cs               |   7 +-
 Blog.Core.Model/Models/TopicDetail.cs         |   6 +-
 Blog.Core.Model/Models/UserRole.cs            |   6 +-
 Blog.Core.Model/Models/WeChatCompany.cs       |   6 +-
 Blog.Core.Model/Models/WeChatConfig.cs        |   6 +-
 Blog.Core.Model/Models/WeChatPushLog.cs       |   6 +-
 Blog.Core.Model/Models/WeChatQR.cs            |   6 +-
 Blog.Core.Model/Models/WeChatSub.cs           |   6 +-
 Blog.Core.Model/Models/WeChatUploadFile.cs    |   6 +-
 Blog.Core.Model/Models/sysUserInfo.cs         |   7 +-
 Blog.Core.Model/PageModel.cs                  |   2 -
 .../Systems/DataBase/DatabaseOutput.cs        |   4 +-
 Blog.Core.Model/TableModel.cs                 |   4 +-
 .../ViewModels/AdvertisementViewModels.cs     |   4 +-
 Blog.Core.Model/ViewModels/BlogViewModels.cs  |   4 +-
 Blog.Core.Model/ViewModels/EnumDemoDto.cs     |   5 +-
 .../ViewModels/GuestbookViewModels.cs         |   3 +-
 .../ViewModels/PayReturnResultModel.cs        |   5 +-
 .../ViewModels/RootTKey/SysUserInfoDtoRoot.cs |   5 +-
 .../ViewModels/SidebarMenuViewModel.cs        |   4 +-
 Blog.Core.Model/ViewModels/SysUserInfoDto.cs  |   3 +-
 Blog.Core.Model/ViewModels/TaskInfoDto.cs     |   6 +-
 Blog.Core.Model/ViewModels/WeChatApiDto.cs    |   6 +-
 .../ViewModels/WeChatCardMsgDataDto.cs        |   6 +-
 .../ViewModels/WeChatCardMsgDataOpenIDDto.cs  |   6 +-
 .../ViewModels/WeChatCardMsgDetailDto.cs      |   6 +-
 .../ViewModels/WeChatMenuButtonDto.cs         |   6 +-
 Blog.Core.Model/ViewModels/WeChatMenuDto.cs   |   6 +-
 .../ViewModels/WeChatOpenIDsDto.cs            |   6 +-
 .../ViewModels/WeChatPushCardMsgDetailDto.cs  |   6 +-
 .../ViewModels/WeChatPushCardMsgDto.cs        |   6 +-
 .../WeChatPushCardMsgValueColorDto.cs         |   6 +-
 .../ViewModels/WeChatPushLinkMsgContentDto.cs |   6 +-
 .../ViewModels/WeChatPushPictureContentDto.cs |   6 +-
 .../ViewModels/WeChatPushTestDto.cs           |   6 +-
 .../ViewModels/WeChatPushTextContentDto.cs    |   6 +-
 .../ViewModels/WeChatPushVideoContentDto.cs   |   6 +-
 .../ViewModels/WeChatPushVoiceContentDto.cs   |   6 +-
 .../ViewModels/WeChatQRActionDto.cs           |   6 +-
 .../ViewModels/WeChatQRActionInfoDto.cs       |   6 +-
 Blog.Core.Model/ViewModels/WeChatQRDto.cs     |   6 +-
 .../ViewModels/WeChatResponseUserInfo.cs      |   7 +-
 Blog.Core.Model/ViewModels/WeChatUserInfo.cs  |   6 +-
 .../ViewModels/WeChatUserInfoOpenID.cs        |   6 +-
 Blog.Core.Model/ViewModels/WeChatValidDto.cs  |   5 +-
 Blog.Core.Model/ViewModels/WeChatXMLDto.cs    |   5 +-
 Blog.Core.Repository/BASE/BaseRepository.cs   |   2 +-
 Blog.Core.Services/PayServices.cs             |   1 +
 Blog.Core.sln                                 |   6 +
 Directory.Build.props                         |   1 +
 123 files changed, 722 insertions(+), 765 deletions(-)
 create mode 100644 Blog.Core.Migrate/Attributes/DataDictionaryAttribute.cs
 create mode 100644 Blog.Core.Migrate/Attributes/MigrateAttribute.cs
 create mode 100644 Blog.Core.Migrate/Attributes/MigrateVersionAttribute.cs
 create mode 100644 Blog.Core.Migrate/Blog.Core.Migrate.csproj
 create mode 100644 Blog.Core.Migrate/Core/IMigrate.cs
 create mode 100644 Blog.Core.Migrate/Core/MigrateCore.cs
 create mode 100644 Blog.Core.Migrate/Core/TableVersion.cs
 rename Blog.Core.Model/{Models => Base}/RootTkey/BaseEntity.cs (93%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/DepartmentRoot.cs (80%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/Interface/IDeleteFilter.cs (69%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/ModulesRoot.cs (85%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/PermissionRoot.cs (84%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/RoleModulePermissionRoot.cs (90%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/RootEntityTkey.cs (81%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/TopicDetailRoot.cs (82%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/UserRoleRoot.cs (90%)
 rename Blog.Core.Model/{Models => Base}/RootTkey/sysUserInfoRoot.cs (81%)
 rename Blog.Core.Model/{ => Base}/Tenants/ITenantEntity.cs (79%)
 rename Blog.Core.Model/{ => Base}/Tenants/MultiTenantAttribute.cs (90%)
 rename Blog.Core.Model/{ => Base}/Tenants/TenantTypeEnum.cs (91%)
 create mode 100644 Blog.Core.Model/GlobalUsings.cs

diff --git a/Blog.Core.Api/Blog.Core.Api.csproj b/Blog.Core.Api/Blog.Core.Api.csproj
index 8bc327ab..669bab33 100644
--- a/Blog.Core.Api/Blog.Core.Api.csproj
+++ b/Blog.Core.Api/Blog.Core.Api.csproj
@@ -6,7 +6,6 @@
     <!--<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>-->
     <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
     <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
-    <LangVersion>default</LangVersion>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml
index 00b4c5be..1b1451c9 100644
--- a/Blog.Core.Api/Blog.Core.Model.xml
+++ b/Blog.Core.Api/Blog.Core.Model.xml
@@ -4,195 +4,63 @@
         <name>Blog.Core.Model</name>
     </assembly>
     <members>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.NONE">
-            <summary>
-            无任何权限
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.Custom">
-            <summary>
-            自定义权限
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepart">
-            <summary>
-            本部门
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepartAndDown">
-            <summary>
-            本部门及以下
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.OnlySelf">
-            <summary>
-            仅自己
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.ALL">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Enabled">
             <summary>
-            所有
+            状态 <br/>
+            中立字段,某些表可使用某些表不使用
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationRole">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsDeleted">
             <summary>
-            以下model 来自ids4项目,多库模式,为了调取ids4数据
-            角色表
+            中立字段,某些表可使用某些表不使用   <br/>
+            逻辑上的删除,非物理删除  <br/>
+            例如:单据删除并非直接删除
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
-             <summary>
-            排序
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsInternal">
             <summary>
-            是否激活
+            中立字段 <br/>
+            是否内置数据
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateId">
             <summary>
             创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateBy">
             <summary>
             创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateTime">
             <summary>
             创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyId">
             <summary>
             修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
-            <summary>
-            修改者
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
-            <summary>
-            修改时间
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationUser">
-            <summary>
-            以下model 来自ids4项目,多库模式,为了调取ids4数据
-            用户表
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Love">
-            <summary>
-            这是爱
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Love.Id">
-            <summary>
-            id
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Love.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Love.Age">
-            <summary>
-            年龄
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.MessageModel`1">
-            <summary>
-            通用返回信息类
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.status">
-            <summary>
-            状态码
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.success">
-            <summary>
-            操作是否成功
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.msg">
-            <summary>
-            返回信息
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.msgDev">
-            <summary>
-            开发者信息
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.response">
-            <summary>
-            返回数据集合
-            </summary>
-        </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String)">
-            <summary>
-            返回成功
-            </summary>
-            <param name="msg">消息</param>
-            <returns></returns>
-        </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String,`0)">
-            <summary>
-            返回成功
-            </summary>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
-        </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String)">
-            <summary>
-            返回失败
-            </summary>
-            <param name="msg">消息</param>
-            <returns></returns>
-        </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String,`0)">
-            <summary>
-            返回失败
-            </summary>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
-        </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
-            <summary>
-            返回消息
-            </summary>
-            <param name="success">失败/成功</param>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
-        </member>
-        <member name="P:Blog.Core.Model.MessageModel.status">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyBy">
             <summary>
-            状态码
+            更新者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.success">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyTime">
             <summary>
-            操作是否成功
+            修改日期
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.msg">
+        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Version">
             <summary>
-            返回信息
+            数据版本
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.response">
+        <member name="T:Blog.Core.Model.Models.RootTkey.Interface.IDeleteFilter">
             <summary>
-            返回数据集合
+            软删除 过滤器
             </summary>
         </member>
         <member name="T:Blog.Core.Model.Models.AccessTrendLog">
@@ -837,65 +705,6 @@
             修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Enabled">
-            <summary>
-            状态 <br/>
-            中立字段,某些表可使用某些表不使用
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsDeleted">
-            <summary>
-            中立字段,某些表可使用某些表不使用   <br/>
-            逻辑上的删除,非物理删除  <br/>
-            例如:单据删除并非直接删除
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsInternal">
-            <summary>
-            中立字段 <br/>
-            是否内置数据
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateId">
-            <summary>
-            创建ID
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateBy">
-            <summary>
-            创建者
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateTime">
-            <summary>
-            创建时间
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyId">
-            <summary>
-            修改ID
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyBy">
-            <summary>
-            更新者
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyTime">
-            <summary>
-            修改日期
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Version">
-            <summary>
-            数据版本
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Models.RootTkey.Interface.IDeleteFilter">
-            <summary>
-            软删除 过滤器
-            </summary>
-        </member>
         <member name="T:Blog.Core.Model.Models.SysTenant">
             <summary>
             系统租户表 <br/>
@@ -1239,6 +1048,11 @@
             金额
             </summary>
         </member>
+        <member name="P:Blog.Core.Model.Models.MultiBusinessTable.Remark">
+            <summary>
+            备注(测试增加字段,多表迁移)
+            </summary>
+        </member>
         <member name="T:Blog.Core.Model.Models.SubLibraryBusinessTable">
             <summary>
             多租户-多库方案 业务表 <br/>
@@ -1255,6 +1069,11 @@
             金额
             </summary>
         </member>
+        <member name="P:Blog.Core.Model.Models.SubLibraryBusinessTable.Remark">
+            <summary>
+            备注(测试增加字段,多库迁移)
+            </summary>
+        </member>
         <member name="T:Blog.Core.Model.Models.Topic">
             <summary>
             Tibug 类别
@@ -1890,6 +1709,234 @@
             角色ID
             </summary>
         </member>
+        <member name="T:Blog.Core.Model.Tenants.ITenantEntity">
+            <summary>
+            租户模型接口
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Tenants.ITenantEntity.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.Tenants.MultiTenantAttribute">
+            <summary>
+            标识 多租户 的业务表 <br/>
+            默认设置是多库       <br/>
+            公共表无需区分 直接使用主库 各自业务在各自库中 <br/>
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.Tenants.TenantTypeEnum">
+            <summary>
+            租户隔离方案
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Id">
+            <summary>
+            Id隔离
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Db">
+            <summary>
+            库隔离
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Tables">
+            <summary>
+            表隔离
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.NONE">
+            <summary>
+            无任何权限
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.Custom">
+            <summary>
+            自定义权限
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepart">
+            <summary>
+            本部门
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepartAndDown">
+            <summary>
+            本部门及以下
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.OnlySelf">
+            <summary>
+            仅自己
+            </summary>
+        </member>
+        <member name="F:Blog.Core.Model.AuthorityScopeEnum.ALL">
+            <summary>
+            所有
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationRole">
+            <summary>
+            以下model 来自ids4项目,多库模式,为了调取ids4数据
+            角色表
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
+             <summary>
+            排序
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
+            <summary>
+            是否激活
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
+            <summary>
+            创建ID
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
+            <summary>
+            创建者
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
+            <summary>
+            创建时间
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
+            <summary>
+            修改ID
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
+            <summary>
+            修改者
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
+            <summary>
+            修改时间
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationUser">
+            <summary>
+            以下model 来自ids4项目,多库模式,为了调取ids4数据
+            用户表
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.Love">
+            <summary>
+            这是爱
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Love.Id">
+            <summary>
+            id
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Love.Name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Love.Age">
+            <summary>
+            年龄
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.MessageModel`1">
+            <summary>
+            通用返回信息类
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel`1.status">
+            <summary>
+            状态码
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel`1.success">
+            <summary>
+            操作是否成功
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel`1.msg">
+            <summary>
+            返回信息
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel`1.msgDev">
+            <summary>
+            开发者信息
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel`1.response">
+            <summary>
+            返回数据集合
+            </summary>
+        </member>
+        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String)">
+            <summary>
+            返回成功
+            </summary>
+            <param name="msg">消息</param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String,`0)">
+            <summary>
+            返回成功
+            </summary>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String)">
+            <summary>
+            返回失败
+            </summary>
+            <param name="msg">消息</param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String,`0)">
+            <summary>
+            返回失败
+            </summary>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
+        </member>
+        <member name="M:Blog.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
+            <summary>
+            返回消息
+            </summary>
+            <param name="success">失败/成功</param>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel.status">
+            <summary>
+            状态码
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel.success">
+            <summary>
+            操作是否成功
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel.msg">
+            <summary>
+            返回信息
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.MessageModel.response">
+            <summary>
+            返回数据集合
+            </summary>
+        </member>
         <member name="T:Blog.Core.Model.PageModel`1">
             <summary>
             通用分页信息类
@@ -1992,43 +2039,6 @@
             返回数据集
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Tenants.ITenantEntity">
-            <summary>
-            租户模型接口
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Tenants.ITenantEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Tenants.MultiTenantAttribute">
-            <summary>
-            标识 多租户 的业务表 <br/>
-            默认设置是多库       <br/>
-            公共表无需区分 直接使用主库 各自业务在各自库中 <br/>
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Tenants.TenantTypeEnum">
-            <summary>
-            租户隔离方案
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Id">
-            <summary>
-            Id隔离
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Db">
-            <summary>
-            库隔离
-            </summary>
-        </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Tables">
-            <summary>
-            表隔离
-            </summary>
-        </member>
         <member name="T:Blog.Core.Model.ViewModels.AdvertisementViewModels">
             <summary>
             广告类
diff --git a/Blog.Core.Api/Controllers/Systems/DataBaseController.cs b/Blog.Core.Api/Controllers/Systems/DataBaseController.cs
index 1f7b3089..7c103e1e 100644
--- a/Blog.Core.Api/Controllers/Systems/DataBaseController.cs
+++ b/Blog.Core.Api/Controllers/Systems/DataBaseController.cs
@@ -3,9 +3,9 @@
 using Blog.Core.Common.DB;
 using Blog.Core.Controllers;
 using Blog.Core.Model;
+using Blog.Core.Model.Base.Tenants;
 using Blog.Core.Model.Models;
 using Blog.Core.Model.Systems.DataBase;
-using Blog.Core.Model.Tenants;
 using Mapster;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
diff --git a/Blog.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs b/Blog.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs
index 37c84791..5d00c67e 100644
--- a/Blog.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs
+++ b/Blog.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs
@@ -1,7 +1,7 @@
 using Blog.Core.Common.DB.Extension;
 using Blog.Core.Controllers;
 using Blog.Core.Model;
-using Blog.Core.Model.Models.RootTkey;
+using Blog.Core.Model.Base.RootTkey;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using NetTaste;
diff --git a/Blog.Core.Api/Controllers/Tenant/TenantByDbController.cs b/Blog.Core.Api/Controllers/Tenant/TenantByDbController.cs
index 046f7f7b..4622b02c 100644
--- a/Blog.Core.Api/Controllers/Tenant/TenantByDbController.cs
+++ b/Blog.Core.Api/Controllers/Tenant/TenantByDbController.cs
@@ -3,6 +3,7 @@
 using Blog.Core.IServices.BASE;
 using Blog.Core.Model;
 using Blog.Core.Model.Models;
+using Blog.Core.Model.Models.Tenant;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 
diff --git a/Blog.Core.Api/Controllers/Tenant/TenantByIdController.cs b/Blog.Core.Api/Controllers/Tenant/TenantByIdController.cs
index b015bc6d..06767ed4 100644
--- a/Blog.Core.Api/Controllers/Tenant/TenantByIdController.cs
+++ b/Blog.Core.Api/Controllers/Tenant/TenantByIdController.cs
@@ -3,6 +3,7 @@
 using Blog.Core.IServices.BASE;
 using Blog.Core.Model;
 using Blog.Core.Model.Models;
+using Blog.Core.Model.Models.Tenant;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 
diff --git a/Blog.Core.Api/Controllers/Tenant/TenantByTableController.cs b/Blog.Core.Api/Controllers/Tenant/TenantByTableController.cs
index 6c0b110e..b8c115ed 100644
--- a/Blog.Core.Api/Controllers/Tenant/TenantByTableController.cs
+++ b/Blog.Core.Api/Controllers/Tenant/TenantByTableController.cs
@@ -3,6 +3,7 @@
 using Blog.Core.IServices.BASE;
 using Blog.Core.Model;
 using Blog.Core.Model.Models;
+using Blog.Core.Model.Models.Tenant;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 
diff --git a/Blog.Core.Common/Blog.Core.Common.csproj b/Blog.Core.Common/Blog.Core.Common.csproj
index d147fce9..0fe60252 100644
--- a/Blog.Core.Common/Blog.Core.Common.csproj
+++ b/Blog.Core.Common/Blog.Core.Common.csproj
@@ -44,6 +44,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\Blog.Core.Migrate\Blog.Core.Migrate.csproj" />
     <ProjectReference Include="..\Blog.Core.Model\Blog.Core.Model.csproj" />
     <ProjectReference Include="..\Blog.Core.Serilog.Es\Blog.Core.Serilog.Es.csproj" />
     <ProjectReference Include="..\Ocelot.Provider.Nacos\Ocelot.Provider.Nacos.csproj" />
diff --git a/Blog.Core.Common/DB/Aop/SqlsugarAop.cs b/Blog.Core.Common/DB/Aop/SqlsugarAop.cs
index 7d2031ad..7e5d86bd 100644
--- a/Blog.Core.Common/DB/Aop/SqlsugarAop.cs
+++ b/Blog.Core.Common/DB/Aop/SqlsugarAop.cs
@@ -1,5 +1,3 @@
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Tenants;
 using SqlSugar;
 using StackExchange.Profiling;
 using System;
@@ -7,6 +5,8 @@
 using Blog.Core.Common.LogHelper;
 using Blog.Core.Common.Utility;
 using Blog.Core.Model;
+using Blog.Core.Model.Base.RootTkey;
+using Blog.Core.Model.Base.Tenants;
 
 namespace Blog.Core.Common.DB.Aop;
 
diff --git a/Blog.Core.Common/DB/EntityUtility.cs b/Blog.Core.Common/DB/EntityUtility.cs
index f997a1eb..423186ed 100644
--- a/Blog.Core.Common/DB/EntityUtility.cs
+++ b/Blog.Core.Common/DB/EntityUtility.cs
@@ -6,6 +6,7 @@
 using System.Diagnostics;
 using System.Linq;
 using System.Reflection;
+using Blog.Core.Model.Base.RootTkey;
 
 namespace Blog.Core.Common.DB;
 
diff --git a/Blog.Core.Common/DB/RepositorySetting.cs b/Blog.Core.Common/DB/RepositorySetting.cs
index bfca7174..ea5b026a 100644
--- a/Blog.Core.Common/DB/RepositorySetting.cs
+++ b/Blog.Core.Common/DB/RepositorySetting.cs
@@ -1,10 +1,10 @@
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Models.RootTkey.Interface;
-using Blog.Core.Model.Tenants;
-using SqlSugar;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using Blog.Core.Model.Base.RootTkey;
+using Blog.Core.Model.Base.RootTkey.Interface;
+using Blog.Core.Model.Base.Tenants;
 
 namespace Blog.Core.Common.DB;
 
diff --git a/Blog.Core.Common/DB/TenantUtil.cs b/Blog.Core.Common/DB/TenantUtil.cs
index 8395c271..e4aae11d 100644
--- a/Blog.Core.Common/DB/TenantUtil.cs
+++ b/Blog.Core.Common/DB/TenantUtil.cs
@@ -3,8 +3,8 @@
 using System.IO;
 using System.Linq;
 using System.Reflection;
+using Blog.Core.Model.Base.Tenants;
 using Blog.Core.Model.Models;
-using Blog.Core.Model.Tenants;
 using SqlSugar;
 
 namespace Blog.Core.Common.DB;
diff --git a/Blog.Core.Common/Seed/DBSeed.cs b/Blog.Core.Common/Seed/DBSeed.cs
index 29222802..4435914d 100644
--- a/Blog.Core.Common/Seed/DBSeed.cs
+++ b/Blog.Core.Common/Seed/DBSeed.cs
@@ -2,7 +2,6 @@
 using Blog.Core.Common.Extensions;
 using Blog.Core.Common.Helper;
 using Blog.Core.Model.Models;
-using Blog.Core.Model.Tenants;
 using Magicodes.ExporterAndImporter.Excel;
 using Newtonsoft.Json;
 using SqlSugar;
@@ -10,46 +9,50 @@
 using System.Reflection;
 using System.Text;
 using Blog.Core.Common.Const;
+using Blog.Core.Migrate.Core;
+using Blog.Core.Model.Base.Tenants;
 using Microsoft.Data.SqlClient;
+using Serilog;
 
 namespace Blog.Core.Common.Seed
 {
     public class DBSeed
     {
-        private static string SeedDataFolder = "BlogCore.Data.json/{0}.tsv";
+        private static string _seedDataFolder = "BlogCore.Data.json/{0}.tsv";
 
 
         /// <summary>
         /// 异步添加种子数据
         /// </summary>
         /// <param name="myContext"></param>
-        /// <param name="WebRootPath"></param>
+        /// <param name="webRootPath"></param>
         /// <returns></returns>
-        public static async Task SeedAsync(MyContext myContext, string WebRootPath)
+        public static async Task SeedAsync(MyContext myContext, string webRootPath)
         {
+            var db = myContext.Db;
             try
             {
-                if (string.IsNullOrEmpty(WebRootPath))
+                if (string.IsNullOrEmpty(webRootPath))
                 {
                     throw new Exception("获取wwwroot路径时,异常!");
                 }
 
-                SeedDataFolder = Path.Combine(WebRootPath, SeedDataFolder);
+                _seedDataFolder = Path.Combine(webRootPath, _seedDataFolder);
+
+                Log.Information("===============Blog.Core DataBase Set==================");
+                Log.Information("Master DB ConId: {ConfigId}", myContext.Db.CurrentConnectionConfig.ConfigId);
+                Log.Information("Master DB Type: {DbType}", myContext.Db.CurrentConnectionConfig.DbType);
+                Log.Information("Master DB ConnectString: {ConnectionString}", myContext.Db.CurrentConnectionConfig.ConnectionString);
 
-                Console.WriteLine("************ Blog.Core DataBase Set *****************");
-                Console.WriteLine($"Master DB ConId: {myContext.Db.CurrentConnectionConfig.ConfigId}");
-                Console.WriteLine($"Master DB Type: {myContext.Db.CurrentConnectionConfig.DbType}");
-                Console.WriteLine($"Master DB ConnectString: {myContext.Db.CurrentConnectionConfig.ConnectionString}");
-                Console.WriteLine();
                 if (BaseDBConfig.MainConfig.SlaveConnectionConfigs.AnyNoException())
                 {
                     var index = 0;
                     BaseDBConfig.MainConfig.SlaveConnectionConfigs.ForEach(m =>
                     {
                         index++;
-                        Console.WriteLine($"Slave{index} DB HitRate: {m.HitRate}");
-                        Console.WriteLine($"Slave{index} DB ConnectString: {m.ConnectionString}");
-                        Console.WriteLine($"--------------------------------------");
+                        Log.Information("Slave{Index} DB HitRate: {ObjHitRate}", index, m.HitRate);
+                        Log.Information("Slave{Index} DB ConnectString: {ObjConnectionString}", index, m.ConnectionString);
+                        Log.Information($"--------------------------------------");
                     });
                 }
                 else if (BaseDBConfig.ReuseConfigs.AnyNoException())
@@ -58,36 +61,34 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     BaseDBConfig.ReuseConfigs.ForEach(m =>
                     {
                         index++;
-                        Console.WriteLine($"Reuse{index} DB ID: {m.ConfigId}");
-                        Console.WriteLine($"Reuse{index} DB Type: {m.DbType}");
-                        Console.WriteLine($"Reuse{index} DB ConnectString: {m.ConnectionString}");
-                        Console.WriteLine($"--------------------------------------");
+                        Log.Information("Reuse{Index} DB ID: {ObjConfigId}", index, m.ConfigId);
+                        Log.Information("Reuse{Index} DB Type: {ObjDbType}", index, m.DbType);
+                        Log.Information("Reuse{Index} DB ConnectString: {ObjConnectionString}", index, m.ConnectionString);
+                        Log.Information($"--------------------------------------");
                     });
                 }
 
-                Console.WriteLine();
-
                 // 创建数据库
-                Console.WriteLine($"Create Database(The Db Id:{MyContext.ConnId})...");
+                Log.Information("Create Database(The Db Id:{ConnId})...", MyContext.ConnId);
 
-                if (MyContext.DbType != SqlSugar.DbType.Oracle && MyContext.DbType != SqlSugar.DbType.Dm)
+                if (MyContext.DbType != DbType.Oracle && MyContext.DbType != DbType.Dm)
                 {
                     myContext.Db.DbMaintenance.CreateDatabase();
                     SqlConnection.ClearAllPools();
-                    ConsoleHelper.WriteSuccessLine($"Database created successfully!");
+                    Log.Information($"Database created successfully!");
                 }
                 else
                 {
                     //Oracle 数据库不支持该操作
-                    ConsoleHelper.WriteSuccessLine($"Oracle 数据库不支持该操作,可手动创建Oracle/Dm数据库!");
+                    Log.Warning($"Oracle 数据库不支持该操作,可手动创建Oracle/Dm数据库!");
                 }
 
                 // 创建数据库表,遍历指定命名空间下的class,
                 // 注意不要把其他命名空间下的也添加进来。
-                Console.WriteLine("Create Tables...");
+                Log.Information("Create Tables...");
 
                 var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
-                var referencedAssemblies = System.IO.Directory.GetFiles(path, "Blog.Core.Model.dll")
+                var referencedAssemblies = Directory.GetFiles(path, "Blog.Core.Model.dll")
                    .Select(Assembly.LoadFrom).ToArray();
                 var modelTypes = referencedAssemblies
                    .SelectMany(a => a.DefinedTypes)
@@ -95,23 +96,13 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                    .Where(x => x.IsClass && x.Namespace is "Blog.Core.Model.Models")
                    .Where(s => !s.IsDefined(typeof(MultiTenantAttribute), false))
                    .ToList();
-                modelTypes.ForEach(t =>
-                {
-                    // 这里只支持添加表,不支持删除
-                    // 如果想要删除,数据库直接右键删除,或者联系SqlSugar作者;
-                    if (!myContext.Db.DbMaintenance.IsAnyTable(t.Name))
-                    {
-                        Console.WriteLine(t.Name);
-                        myContext.Db.CodeFirst.SplitTables().InitTables(t);
-                    }
-                });
-                ConsoleHelper.WriteSuccessLine($"Tables created successfully!");
-                Console.WriteLine();
+                await MigrateCore.MigrateAsync(db, modelTypes.ToArray());
+                Log.Information($"Tables created successfully!");
 
-                if (AppSettings.app(new string[] { "AppSettings", "SeedDBDataEnabled" }).ObjToBool())
+                if (AppSettings.app("AppSettings", "SeedDBDataEnabled").ObjToBool())
                 {
                     JsonSerializerSettings setting = new JsonSerializerSettings();
-                    JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
+                    JsonConvert.DefaultSettings = () =>
                     {
                         //日期类型默认格式化处理
                         setting.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
@@ -124,9 +115,9 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                         //setting.Converters.Add(new BoolConvert("是,否"));
 
                         return setting;
-                    });
+                    };
 
-                    Console.WriteLine($"Seeding database data (The Db Id:{MyContext.ConnId})...");
+                    Log.Information("Seeding database data (The Db Id:{ConnId})...", MyContext.ConnId);
 
                     var importer = new ExcelImporter();
 
@@ -136,12 +127,12 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     {
                         myContext.GetEntityDB<BlogArticle>().InsertRange(
                             JsonHelper.ParseFormByJson<List<BlogArticle>>(
-                                FileHelper.ReadFile(string.Format(SeedDataFolder, "BlogArticle"), Encoding.UTF8)));
-                        Console.WriteLine("Table:BlogArticle created success!");
+                                FileHelper.ReadFile(string.Format(_seedDataFolder, "BlogArticle"), Encoding.UTF8)));
+                        Log.Information("Table:BlogArticle created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:BlogArticle already exists...");
+                        Log.Information("Table:BlogArticle already exists...");
                     }
 
                     #endregion
@@ -152,14 +143,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<Modules>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<Modules>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "Modules"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "Modules"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<Modules>().InsertRange(data);
-                        Console.WriteLine("Table:Modules created success!");
+                        Log.Information("Table:Modules created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:Modules already exists...");
+                        Log.Information("Table:Modules already exists...");
                     }
 
                     #endregion
@@ -170,14 +161,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<Permission>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<Permission>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "Permission"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "Permission"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<Permission>().InsertRange(data);
-                        Console.WriteLine("Table:Permission created success!");
+                        Log.Information("Table:Permission created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:Permission already exists...");
+                        Log.Information("Table:Permission already exists...");
                     }
 
                     #endregion
@@ -188,17 +179,17 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<Role>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<Role>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "Role"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "Role"), Encoding.UTF8), setting);
                         //using var stream = new FileStream(Path.Combine(WebRootPath, "BlogCore.Data.excel", "Role.xlsx"), FileMode.Open);
                         //var result = await importer.Import<Role>(stream);
                         //var data = result.Data.ToList();
 
                         myContext.GetEntityDB<Role>().InsertRange(data);
-                        Console.WriteLine("Table:Role created success!");
+                        Log.Information("Table:Role created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:Role already exists...");
+                        Log.Information("Table:Role already exists...");
                     }
 
                     #endregion
@@ -209,15 +200,15 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<RoleModulePermission>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<RoleModulePermission>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "RoleModulePermission"), Encoding.UTF8),
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "RoleModulePermission"), Encoding.UTF8),
                             setting);
 
                         myContext.GetEntityDB<RoleModulePermission>().InsertRange(data);
-                        Console.WriteLine("Table:RoleModulePermission created success!");
+                        Log.Information("Table:RoleModulePermission created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:RoleModulePermission already exists...");
+                        Log.Information("Table:RoleModulePermission already exists...");
                     }
 
                     #endregion
@@ -228,14 +219,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<Topic>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<Topic>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "Topic"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "Topic"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<Topic>().InsertRange(data);
-                        Console.WriteLine("Table:Topic created success!");
+                        Log.Information("Table:Topic created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:Topic already exists...");
+                        Log.Information("Table:Topic already exists...");
                     }
 
                     #endregion
@@ -246,14 +237,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<TopicDetail>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<TopicDetail>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "TopicDetail"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "TopicDetail"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<TopicDetail>().InsertRange(data);
-                        Console.WriteLine("Table:TopicDetail created success!");
+                        Log.Information("Table:TopicDetail created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:TopicDetail already exists...");
+                        Log.Information("Table:TopicDetail already exists...");
                     }
 
                     #endregion
@@ -264,14 +255,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<UserRole>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<UserRole>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "UserRole"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "UserRole"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<UserRole>().InsertRange(data);
-                        Console.WriteLine("Table:UserRole created success!");
+                        Log.Information("Table:UserRole created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:UserRole already exists...");
+                        Log.Information("Table:UserRole already exists...");
                     }
 
                     #endregion
@@ -282,14 +273,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<SysUserInfo>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<SysUserInfo>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "sysUserInfo"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "sysUserInfo"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<SysUserInfo>().InsertRange(data);
-                        Console.WriteLine("Table:sysUserInfo created success!");
+                        Log.Information("Table:sysUserInfo created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:sysUserInfo already exists...");
+                        Log.Information("Table:sysUserInfo already exists...");
                     }
 
                     #endregion
@@ -300,14 +291,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<TasksQz>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<TasksQz>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "TasksQz"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "TasksQz"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<TasksQz>().InsertRange(data);
-                        Console.WriteLine("Table:TasksQz created success!");
+                        Log.Information("Table:TasksQz created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:TasksQz already exists...");
+                        Log.Information("Table:TasksQz already exists...");
                     }
 
                     #endregion
@@ -316,11 +307,11 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
 
                     if (!await myContext.Db.Queryable<TasksLog>().AnyAsync())
                     {
-                        Console.WriteLine("Table:TasksLog created success!");
+                        Log.Information("Table:TasksLog created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:TasksLog already exists...");
+                        Log.Information("Table:TasksLog already exists...");
                     }
 
                     #endregion
@@ -330,14 +321,14 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     if (!await myContext.Db.Queryable<Department>().AnyAsync())
                     {
                         var data = JsonConvert.DeserializeObject<List<Department>>(
-                            FileHelper.ReadFile(string.Format(SeedDataFolder, "Department"), Encoding.UTF8), setting);
+                            FileHelper.ReadFile(string.Format(_seedDataFolder, "Department"), Encoding.UTF8), setting);
 
                         myContext.GetEntityDB<Department>().InsertRange(data);
-                        Console.WriteLine("Table:Department created success!");
+                        Log.Information("Table:Department created success!");
                     }
                     else
                     {
-                        Console.WriteLine("Table:Department already exists...");
+                        Log.Information("Table:Department already exists...");
                     }
 
                     #endregion
@@ -345,10 +336,8 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
                     //种子初始化
                     await SeedDataAsync(myContext.Db);
 
-                    ConsoleHelper.WriteSuccessLine($"Done seeding database!");
+                    Log.Information($"Done seeding database!");
                 }
-
-                Console.WriteLine();
             }
             catch (Exception ex)
             {
@@ -362,7 +351,7 @@ public static async Task SeedAsync(MyContext myContext, string WebRootPath)
         /// <summary>
         /// 种子初始化数据
         /// </summary>
-        /// <param name="myContext"></param>
+        /// <param name="db"></param>
         /// <returns></returns>
         private static async Task SeedDataAsync(ISqlSugarClient db)
         {
@@ -385,12 +374,13 @@ private static async Task SeedDataAsync(ISqlSugarClient db)
                     }
 
                     return false;
-                });
+                }).ToList();
 
             if (!seedDataTypes.Any()) return;
             foreach (var seedType in seedDataTypes)
             {
                 dynamic instance = Activator.CreateInstance(seedType);
+                if (instance is null) continue;
                 //初始化数据
                 {
                     var seedData = instance.InitSeedData();
@@ -402,7 +392,7 @@ private static async Task SeedDataAsync(ISqlSugarClient db)
                         if (!await db.Queryable(entity.DbTableName, "").AnyAsync())
                         {
                             await db.Insertable(Enumerable.ToList(seedData)).ExecuteCommandAsync();
-                            Console.WriteLine($"Table:{entity.DbTableName} init success!");
+                            Log.Information("Table:{EntityDbTableName} init success!", entity.DbTableName);
                         }
                     }
                 }
@@ -416,7 +406,7 @@ private static async Task SeedDataAsync(ISqlSugarClient db)
                         var entity = db.EntityMaintenance.GetEntityInfo(entityType);
 
                         await db.Storageable(Enumerable.ToList(seedData)).ExecuteCommandAsync();
-                        Console.WriteLine($"Table:{entity.DbTableName} seedData success!");
+                        Log.Information("Table:{EntityDbTableName} seedData success!", entity.DbTableName);
                     }
                 }
 
@@ -431,57 +421,35 @@ private static async Task SeedDataAsync(ISqlSugarClient db)
         /// 迁移日志数据库
         /// </summary>
         /// <returns></returns>
-        public static void MigrationLogs(MyContext myContext)
+        public static async Task MigrationLogsAsync(MyContext myContext)
         {
             // 创建数据库表,遍历指定命名空间下的class,
             // 注意不要把其他命名空间下的也添加进来。
-            Console.WriteLine("Create Log Tables...");
+            Log.Information("Create Log Tables...");
             if (!myContext.Db.IsAnyConnection(SqlSugarConst.LogConfigId.ToLower()))
             {
                 throw new ApplicationException("未配置日志数据库,请在appsettings.json中DBS节点中配置");
             }
 
             var logDb = myContext.Db.GetConnection(SqlSugarConst.LogConfigId.ToLower());
-            Console.WriteLine($"Create log Database(The Db Id:{SqlSugarConst.LogConfigId.ToLower()})...");
+            Log.Information("Create log Database(The Db Id:{Lower})...", SqlSugarConst.LogConfigId.ToLower());
             logDb.DbMaintenance.CreateDatabase();
-            ConsoleHelper.WriteSuccessLine($"Log Database created successfully!");
+            Log.Information($"Log Database created successfully!");
             var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
-            var referencedAssemblies = System.IO.Directory.GetFiles(path, "Blog.Core.Model.dll")
+            var referencedAssemblies = Directory.GetFiles(path, "Blog.Core.Model.dll")
                .Select(Assembly.LoadFrom).ToArray();
             var modelTypes = referencedAssemblies
                .SelectMany(a => a.DefinedTypes)
                .Select(type => type.AsType())
                .Where(x => x.IsClass && x.Namespace != null && x.Namespace.StartsWith("Blog.Core.Model.Logs"))
                .ToList();
-            Stopwatch sw = Stopwatch.StartNew();
-
-            var tables = logDb.DbMaintenance.GetTableInfoList();
-
-            modelTypes.ForEach(t =>
-            {
-                // 这里只支持添加修改表,不支持删除
-                // 如果想要删除,数据库直接右键删除,或者联系SqlSugar作者;
-                if (!tables.Any(s => s.Name.Contains(t.Name)))
-                {
-                    Console.WriteLine(t.Name);
-                    if (t.GetCustomAttribute<SplitTableAttribute>() != null)
-                    {
-                        logDb.CodeFirst.SplitTables().InitTables(t);
-                    }
-                    else
-                    {
-                        logDb.CodeFirst.InitTables(t);
-                    }
-                }
-            });
-
+            var sw = Stopwatch.StartNew();
+            await MigrateCore.MigrateAsync(logDb, modelTypes.ToArray());
             sw.Stop();
 
-            $"Log Tables created successfully! {sw.ElapsedMilliseconds}ms".WriteSuccessLine();
-            Console.WriteLine();
+            Log.Information("Log Tables created successfully! {SwElapsedMilliseconds}ms", sw.ElapsedMilliseconds);
         }
 
-
         /// <summary>
         /// 初始化 多租户
         /// </summary>
@@ -493,10 +461,10 @@ public static async Task TenantSeedAsync(MyContext myContext)
                .ToListAsync();
             if (tenants.Any())
             {
-                Console.WriteLine($@"Init Multi Tenant Db");
+                Log.Information($@"Init Multi Tenant Db");
                 foreach (var tenant in tenants)
                 {
-                    Console.WriteLine($@"Init Multi Tenant Db : {tenant.ConfigId}/{tenant.Name}");
+                    Log.Information("Init Multi Tenant Db : {TenantConfigId}/{TenantName}", tenant.ConfigId, tenant.Name);
                     await InitTenantSeedAsync(myContext.Db.AsTenant(), tenant.GetConnectionConfig());
                 }
             }
@@ -513,7 +481,7 @@ public static async Task TenantSeedAsync(MyContext myContext)
 
         private static async Task InitTenantSeedAsync(MyContext myContext, List<SysTenant> tenants)
         {
-            ConsoleHelper.WriteInfoLine($"Init Multi Tenant Tables : {myContext.Db.CurrentConnectionConfig.ConfigId}");
+            Log.Information("Init Multi Tenant Tables : {ConfigId}", myContext.Db.CurrentConnectionConfig.ConfigId);
 
             // 获取所有实体表-初始化租户业务表
             var entityTypes = TenantUtil.GetTenantEntityTypes(TenantTypeEnum.Tables);
@@ -521,22 +489,14 @@ private static async Task InitTenantSeedAsync(MyContext myContext, List<SysTenan
 
             foreach (var sysTenant in tenants)
             {
-                foreach (var entityType in entityTypes)
-                {
-                    myContext.Db.CodeFirst
-                       .As(entityType, entityType.GetTenantTableName(myContext.Db, sysTenant))
-                       .InitTables(entityType);
-
-                    Console.WriteLine($@"Init Tables:{entityType.GetTenantTableName(myContext.Db, sysTenant)}");
-                }
-
                 myContext.Db.SetTenantTable(sysTenant.Id.ToString());
+                await MigrateCore.MigrateAsync(myContext.Db, entityTypes.ToArray());
+               
                 //多租户初始化种子数据
                 await TenantSeedDataAsync(myContext.Db, TenantTypeEnum.Tables);
             }
 
-            ConsoleHelper.WriteSuccessLine(
-                $"Init Multi Tenant Tables : {myContext.Db.CurrentConnectionConfig.ConfigId} created successfully!");
+            Log.Information("Init Multi Tenant Tables : {ConfigId} created successfully!", myContext.Db.CurrentConnectionConfig.ConfigId);
         }
 
         #endregion
@@ -557,23 +517,14 @@ public static async Task InitTenantSeedAsync(ITenant itenant, ConnectionConfig c
             var db = itenant.GetConnectionScope(config.ConfigId);
 
             db.DbMaintenance.CreateDatabase();
-            ConsoleHelper.WriteSuccessLine($"Init Multi Tenant Db : {config.ConfigId} Database created successfully!");
-
-            Console.WriteLine($@"Init Multi Tenant Db : {config.ConfigId}  Create Tables");
+            Log.Information("Init Multi Tenant Db : {ConfigConfigId} Database created successfully!", config.ConfigId);
 
+            Log.Information("Init Multi Tenant Db : {ConfigConfigId}  Create Tables", config.ConfigId);
             // 获取所有实体表-初始化租户业务表
             var entityTypes = TenantUtil.GetTenantEntityTypes(TenantTypeEnum.Db);
             if (!entityTypes.Any()) return;
-            foreach (var entityType in entityTypes)
-            {
-                var splitTable = entityType.GetCustomAttribute<SplitTableAttribute>();
-                if (splitTable == null)
-                    db.CodeFirst.InitTables(entityType);
-                else
-                    db.CodeFirst.SplitTables().InitTables(entityType);
 
-                Console.WriteLine(entityType.Name);
-            }
+            await MigrateCore.MigrateAsync(db, entityTypes.ToArray());
 
             //多租户初始化种子数据
             await TenantSeedDataAsync(db, TenantTypeEnum.Db);
@@ -599,11 +550,12 @@ private static async Task TenantSeedDataAsync(ISqlSugarClient db, TenantTypeEnum
 
                     var eType = esd.GenericTypeArguments[0];
                     return eType.IsTenantEntity(tenantType);
-                });
+                }).ToList();
             if (!seedDataTypes.Any()) return;
             foreach (var seedType in seedDataTypes)
             {
                 dynamic instance = Activator.CreateInstance(seedType);
+                if (instance is null) continue;
                 //初始化数据
                 {
                     var seedData = instance.InitSeedData();
@@ -615,7 +567,7 @@ private static async Task TenantSeedDataAsync(ISqlSugarClient db, TenantTypeEnum
                         if (!await db.Queryable(entity.DbTableName, "").AnyAsync())
                         {
                             await db.Insertable(Enumerable.ToList(seedData)).ExecuteCommandAsync();
-                            Console.WriteLine($"Table:{entity.DbTableName} init success!");
+                            Log.Information("Table:{EntityDbTableName} init success!", entity.DbTableName);
                         }
                     }
                 }
@@ -629,7 +581,7 @@ private static async Task TenantSeedDataAsync(ISqlSugarClient db, TenantTypeEnum
                         var entity = db.EntityMaintenance.GetEntityInfo(entityType);
 
                         await db.Storageable(Enumerable.ToList(seedData)).ExecuteCommandAsync();
-                        Console.WriteLine($"Table:{entity.DbTableName} seedData success!");
+                        Log.Information("Table:{EntityDbTableName} seedData success!", entity.DbTableName);
                     }
                 }
 
diff --git a/Blog.Core.Common/Seed/SeedData/BusinessDataSeedData.cs b/Blog.Core.Common/Seed/SeedData/BusinessDataSeedData.cs
index 361cd725..8edf4e2b 100644
--- a/Blog.Core.Common/Seed/SeedData/BusinessDataSeedData.cs
+++ b/Blog.Core.Common/Seed/SeedData/BusinessDataSeedData.cs
@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Blog.Core.Model.Models;
+using Blog.Core.Model.Models.Tenant;
 using SqlSugar;
 
 namespace Blog.Core.Common.Seed.SeedData;
diff --git a/Blog.Core.Common/Seed/SeedData/MultiBusinessDataSeedData.cs b/Blog.Core.Common/Seed/SeedData/MultiBusinessDataSeedData.cs
index 4ca1a7dd..2ef264a1 100644
--- a/Blog.Core.Common/Seed/SeedData/MultiBusinessDataSeedData.cs
+++ b/Blog.Core.Common/Seed/SeedData/MultiBusinessDataSeedData.cs
@@ -2,6 +2,7 @@
 using SqlSugar;
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using Blog.Core.Model.Models.Tenant;
 
 namespace Blog.Core.Common.Seed.SeedData;
 
diff --git a/Blog.Core.Common/Seed/SeedData/MultiBusinessSubDataSeedData.cs b/Blog.Core.Common/Seed/SeedData/MultiBusinessSubDataSeedData.cs
index e73d4603..26dce8c7 100644
--- a/Blog.Core.Common/Seed/SeedData/MultiBusinessSubDataSeedData.cs
+++ b/Blog.Core.Common/Seed/SeedData/MultiBusinessSubDataSeedData.cs
@@ -2,6 +2,7 @@
 using SqlSugar;
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using Blog.Core.Model.Models.Tenant;
 
 namespace Blog.Core.Common.Seed.SeedData;
 
diff --git a/Blog.Core.Common/Seed/SeedData/SubBusinessDataSeedData.cs b/Blog.Core.Common/Seed/SeedData/SubBusinessDataSeedData.cs
index 3d7b8937..887f1cde 100644
--- a/Blog.Core.Common/Seed/SeedData/SubBusinessDataSeedData.cs
+++ b/Blog.Core.Common/Seed/SeedData/SubBusinessDataSeedData.cs
@@ -3,6 +3,7 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Blog.Core.Common.Utility;
+using Blog.Core.Model.Models.Tenant;
 
 namespace Blog.Core.Common.Seed.SeedData;
 
diff --git a/Blog.Core.Common/Seed/SeedData/TenantSeedData.cs b/Blog.Core.Common/Seed/SeedData/TenantSeedData.cs
index f33f83b2..8e53a280 100644
--- a/Blog.Core.Common/Seed/SeedData/TenantSeedData.cs
+++ b/Blog.Core.Common/Seed/SeedData/TenantSeedData.cs
@@ -3,8 +3,8 @@
 using System.IO;
 using System.Threading.Tasks;
 using Blog.Core.Common.DB;
+using Blog.Core.Model.Base.Tenants;
 using Blog.Core.Model.Models;
-using Blog.Core.Model.Tenants;
 using SqlSugar;
 
 namespace Blog.Core.Common.Seed.SeedData;
diff --git a/Blog.Core.Extensions/HostedService/SeedDataHostedService.cs b/Blog.Core.Extensions/HostedService/SeedDataHostedService.cs
index e1da3d69..bbb6f75a 100644
--- a/Blog.Core.Extensions/HostedService/SeedDataHostedService.cs
+++ b/Blog.Core.Extensions/HostedService/SeedDataHostedService.cs
@@ -40,7 +40,7 @@ private async Task DoWork()
                 await DBSeed.SeedAsync(_myContext, _webRootPath);
 
                 //日志
-                DBSeed.MigrationLogs(_myContext);
+               await DBSeed.MigrationLogsAsync(_myContext);
 
                 //多租户 同步
                 await DBSeed.TenantSeedAsync(_myContext);
diff --git a/Blog.Core.IServices/IPayServices.cs b/Blog.Core.IServices/IPayServices.cs
index 712ada39..ba439eea 100644
--- a/Blog.Core.IServices/IPayServices.cs
+++ b/Blog.Core.IServices/IPayServices.cs
@@ -3,6 +3,7 @@
 using Blog.Core.Model;
 using Blog.Core.Model.ViewModels;
 using System.Threading.Tasks;
+using Blog.Core.Model.Base.RootTkey;
 
 namespace Blog.Core.IServices
 {
diff --git a/Blog.Core.Migrate/Attributes/DataDictionaryAttribute.cs b/Blog.Core.Migrate/Attributes/DataDictionaryAttribute.cs
new file mode 100644
index 00000000..8acbc0cc
--- /dev/null
+++ b/Blog.Core.Migrate/Attributes/DataDictionaryAttribute.cs
@@ -0,0 +1,13 @@
+namespace Blog.Core.Migrate.Attributes;
+
+/// <summary>
+/// 数据字典 <br />
+/// 程序内置Code和Name
+/// 例如 <br />
+/// SO:销售订单<br />
+/// 1:男
+/// </summary>
+[AttributeUsage(AttributeTargets.Enum)]
+public class DataDictionaryAttribute : Attribute
+{
+}
\ No newline at end of file
diff --git a/Blog.Core.Migrate/Attributes/MigrateAttribute.cs b/Blog.Core.Migrate/Attributes/MigrateAttribute.cs
new file mode 100644
index 00000000..b66f4ff5
--- /dev/null
+++ b/Blog.Core.Migrate/Attributes/MigrateAttribute.cs
@@ -0,0 +1,13 @@
+namespace Blog.Core.Migrate.Attributes;
+
+/// <summary>
+/// 迁移
+/// </summary>
+[AttributeUsage(AttributeTargets.Class)]
+public class MigrateAttribute : Attribute
+{
+    /// <summary>
+    /// 是否开启迁移
+    /// </summary>
+    public bool Enable { get; set; } = true;
+}
\ No newline at end of file
diff --git a/Blog.Core.Migrate/Attributes/MigrateVersionAttribute.cs b/Blog.Core.Migrate/Attributes/MigrateVersionAttribute.cs
new file mode 100644
index 00000000..80ed2467
--- /dev/null
+++ b/Blog.Core.Migrate/Attributes/MigrateVersionAttribute.cs
@@ -0,0 +1,21 @@
+namespace Blog.Core.Migrate.Attributes;
+
+/// <summary>
+/// 标记版本 <br />
+/// 提高CodeFirst的性能 不必要做性能牺牲 <br />
+/// 修改实体的字段、特性、索引等 <br />
+/// 一定要修改版本号!!! <br />
+/// 一定要修改版本号!!! <br />
+/// 一定要修改版本号!!! <br />
+/// 否则不会主动修改
+/// </summary>
+[AttributeUsage(AttributeTargets.Class)]
+public class MigrateVersionAttribute : Attribute
+{
+    public MigrateVersionAttribute(string version)
+    {
+        Version = Version.Parse(version);
+    }
+
+    public Version Version { get; set; }
+}
\ No newline at end of file
diff --git a/Blog.Core.Migrate/Blog.Core.Migrate.csproj b/Blog.Core.Migrate/Blog.Core.Migrate.csproj
new file mode 100644
index 00000000..54273772
--- /dev/null
+++ b/Blog.Core.Migrate/Blog.Core.Migrate.csproj
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <PackageReference Include="Serilog" Version="3.1.1" />
+      <PackageReference Include="SqlSugarCore" Version="5.1.4.158" />
+    </ItemGroup>
+
+</Project>
diff --git a/Blog.Core.Migrate/Core/IMigrate.cs b/Blog.Core.Migrate/Core/IMigrate.cs
new file mode 100644
index 00000000..36f461e2
--- /dev/null
+++ b/Blog.Core.Migrate/Core/IMigrate.cs
@@ -0,0 +1,13 @@
+using SqlSugar;
+
+namespace Blog.Core.Migrate.Core;
+
+public interface IMigrate<T>
+{
+    ISqlSugarClient Orm { get; set; }
+    string TableName { get; set; }
+    DbType DbType { get; set; }
+    Version Version { get; set; }
+
+    void Execution();
+}
\ No newline at end of file
diff --git a/Blog.Core.Migrate/Core/MigrateCore.cs b/Blog.Core.Migrate/Core/MigrateCore.cs
new file mode 100644
index 00000000..5334ca83
--- /dev/null
+++ b/Blog.Core.Migrate/Core/MigrateCore.cs
@@ -0,0 +1,99 @@
+using System.Reflection;
+using Blog.Core.Migrate.Attributes;
+using Serilog;
+using SqlSugar;
+
+namespace Blog.Core.Migrate.Core;
+
+public static class MigrateCore
+{
+    private static async Task<Dictionary<string, string>> GetTableVersionsAsync(ISqlSugarClient db)
+    {
+        if (!db.DbMaintenance.IsAnyTable(nameof(TableVersion))) db.CodeFirst.InitTables(typeof(TableVersion));
+        return (await db.Queryable<TableVersion>().ToListAsync()).ToDictionary(s => s.TableName, s => s.Version);
+    }
+
+    public static MigrateVersionAttribute GetMigrateVersion<T>()
+    {
+        return GetMigrateVersion(typeof(T));
+    }
+
+    public static MigrateVersionAttribute GetMigrateVersion(Type type)
+    {
+        return type.GetCustomAttribute<MigrateVersionAttribute>();
+    }
+
+    public static bool IsSplitTable(Type type)
+    {
+        return type.GetCustomAttribute<SplitTableAttribute>() != null;
+    }
+
+    public static bool IsMigrate(Type type)
+    {
+        var ma = type.GetCustomAttribute<MigrateAttribute>();
+        return ma == null || ma.Enable;
+    }
+
+    public static void Migrate(ISqlSugarClient context, Type type)
+    {
+        if (!IsMigrate(type)) return;
+
+        if (IsSplitTable(type))
+            context.CodeFirst.SplitTables().InitTables(type);
+        else
+            context.CodeFirst.InitTables(type);
+    }
+
+    public static async Task MigrateAsync(ISqlSugarClient context, IEnumerable<Type> types)
+    {
+        var oldVersions = await GetTableVersionsAsync(context);
+
+        foreach (var type in types)
+        {
+            if (!IsMigrate(type)) continue;
+
+            var version = GetMigrateVersion(type);
+            if (version == null)
+            {
+                //没有标记版本号的表 只会初始化 不会迁移
+                //表不存在初始化
+                if (!context.DbMaintenance.IsAnyTable(type.Name))
+                {
+                    Log.Logger.Information("Init Table:{TableName}", type.Name);
+                    Migrate(context, type);
+                }
+                continue;
+            }
+
+            var tableName = context.MappingTables.FirstOrDefault(s => s.EntityName == type.Name)?.DbTableName;
+            if (string.IsNullOrWhiteSpace(tableName))
+            {
+                tableName = context.EntityMaintenance.GetEntityInfo(type).DbTableName;
+            }
+
+            var ver = oldVersions.GetValueOrDefault(tableName);
+            if (ver != null)
+            {
+                var oldVersion = new Version(ver);
+                if (oldVersion >= version.Version) continue;
+            }
+
+            Log.Logger.Information("Modify Table:{TableName} oldVersion:{Ver} newVersion:{NewVersion}",
+                tableName, ver, version.Version);
+            Migrate(context, type);
+
+            if (ver == null)
+                await context.Insertable(new TableVersion
+                {
+                    TableName = tableName,
+                    Version = version.Version.ToString()
+                }).ExecuteCommandAsync();
+            else
+                await context.Updateable(new TableVersion
+                {
+                    TableName = tableName,
+                    Version = version.Version.ToString()
+                }).ExecuteCommandAsync();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Blog.Core.Migrate/Core/TableVersion.cs b/Blog.Core.Migrate/Core/TableVersion.cs
new file mode 100644
index 00000000..888a4595
--- /dev/null
+++ b/Blog.Core.Migrate/Core/TableVersion.cs
@@ -0,0 +1,18 @@
+using SqlSugar;
+
+namespace Blog.Core.Migrate.Core;
+
+/// <summary>
+/// 数据表版本
+/// </summary>
+public class TableVersion
+{
+    /// <summary>
+    /// 表名称
+    /// </summary>
+    [SugarColumn(Length = 128, IsPrimaryKey = true)]
+    public string TableName { get; set; }
+
+    [SugarColumn(Length = 50)]
+    public string Version { get; set; }
+}
\ No newline at end of file
diff --git a/Blog.Core.Model/Base/BaseLog.cs b/Blog.Core.Model/Base/BaseLog.cs
index 829ff09e..bce8bffa 100644
--- a/Blog.Core.Model/Base/BaseLog.cs
+++ b/Blog.Core.Model/Base/BaseLog.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Base;
+namespace Blog.Core.Model.Base;
 
 public abstract class BaseLog : RootEntityTkey<long>
 {
diff --git a/Blog.Core.Model/Models/RootTkey/BaseEntity.cs b/Blog.Core.Model/Base/RootTkey/BaseEntity.cs
similarity index 93%
rename from Blog.Core.Model/Models/RootTkey/BaseEntity.cs
rename to Blog.Core.Model/Base/RootTkey/BaseEntity.cs
index 5d5d4414..b120bcd9 100644
--- a/Blog.Core.Model/Models/RootTkey/BaseEntity.cs
+++ b/Blog.Core.Model/Base/RootTkey/BaseEntity.cs
@@ -1,8 +1,6 @@
-using Blog.Core.Model.Models.RootTkey.Interface;
-using SqlSugar;
-using System;
+using Blog.Core.Model.Base.RootTkey.Interface;
 
-namespace Blog.Core.Model.Models.RootTkey;
+namespace Blog.Core.Model.Base.RootTkey;
 
 [SugarIndex("index_{table}_Enabled", nameof(Enabled), OrderByType.Asc)]
 [SugarIndex("index_{table}_IsDeleted", nameof(IsDeleted), OrderByType.Asc)]
diff --git a/Blog.Core.Model/Models/RootTkey/DepartmentRoot.cs b/Blog.Core.Model/Base/RootTkey/DepartmentRoot.cs
similarity index 80%
rename from Blog.Core.Model/Models/RootTkey/DepartmentRoot.cs
rename to Blog.Core.Model/Base/RootTkey/DepartmentRoot.cs
index ab10c9f8..df99de59 100644
--- a/Blog.Core.Model/Models/RootTkey/DepartmentRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/DepartmentRoot.cs
@@ -1,8 +1,4 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 部门表
diff --git a/Blog.Core.Model/Models/RootTkey/Interface/IDeleteFilter.cs b/Blog.Core.Model/Base/RootTkey/Interface/IDeleteFilter.cs
similarity index 69%
rename from Blog.Core.Model/Models/RootTkey/Interface/IDeleteFilter.cs
rename to Blog.Core.Model/Base/RootTkey/Interface/IDeleteFilter.cs
index 57d421e9..66011658 100644
--- a/Blog.Core.Model/Models/RootTkey/Interface/IDeleteFilter.cs
+++ b/Blog.Core.Model/Base/RootTkey/Interface/IDeleteFilter.cs
@@ -1,4 +1,4 @@
-namespace Blog.Core.Model.Models.RootTkey.Interface;
+namespace Blog.Core.Model.Base.RootTkey.Interface;
 
 /// <summary>
 /// 软删除 过滤器
diff --git a/Blog.Core.Model/Models/RootTkey/ModulesRoot.cs b/Blog.Core.Model/Base/RootTkey/ModulesRoot.cs
similarity index 85%
rename from Blog.Core.Model/Models/RootTkey/ModulesRoot.cs
rename to Blog.Core.Model/Base/RootTkey/ModulesRoot.cs
index 64d2eef4..8f5c1270 100644
--- a/Blog.Core.Model/Models/RootTkey/ModulesRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/ModulesRoot.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 接口API地址信息表 
diff --git a/Blog.Core.Model/Models/RootTkey/PermissionRoot.cs b/Blog.Core.Model/Base/RootTkey/PermissionRoot.cs
similarity index 84%
rename from Blog.Core.Model/Models/RootTkey/PermissionRoot.cs
rename to Blog.Core.Model/Base/RootTkey/PermissionRoot.cs
index a001b99f..55754505 100644
--- a/Blog.Core.Model/Models/RootTkey/PermissionRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/PermissionRoot.cs
@@ -1,8 +1,4 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 路由菜单表
diff --git a/Blog.Core.Model/Models/RootTkey/RoleModulePermissionRoot.cs b/Blog.Core.Model/Base/RootTkey/RoleModulePermissionRoot.cs
similarity index 90%
rename from Blog.Core.Model/Models/RootTkey/RoleModulePermissionRoot.cs
rename to Blog.Core.Model/Base/RootTkey/RoleModulePermissionRoot.cs
index 72c4e3d8..024cd03f 100644
--- a/Blog.Core.Model/Models/RootTkey/RoleModulePermissionRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/RoleModulePermissionRoot.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 按钮跟权限关联表
diff --git a/Blog.Core.Model/Models/RootTkey/RootEntityTkey.cs b/Blog.Core.Model/Base/RootTkey/RootEntityTkey.cs
similarity index 81%
rename from Blog.Core.Model/Models/RootTkey/RootEntityTkey.cs
rename to Blog.Core.Model/Base/RootTkey/RootEntityTkey.cs
index 20bdda0d..de8f802c 100644
--- a/Blog.Core.Model/Models/RootTkey/RootEntityTkey.cs
+++ b/Blog.Core.Model/Base/RootTkey/RootEntityTkey.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     public class RootEntityTkey<Tkey> where Tkey : IEquatable<Tkey>
     {
diff --git a/Blog.Core.Model/Models/RootTkey/TopicDetailRoot.cs b/Blog.Core.Model/Base/RootTkey/TopicDetailRoot.cs
similarity index 82%
rename from Blog.Core.Model/Models/RootTkey/TopicDetailRoot.cs
rename to Blog.Core.Model/Base/RootTkey/TopicDetailRoot.cs
index 8ae42152..6df85d9d 100644
--- a/Blog.Core.Model/Models/RootTkey/TopicDetailRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/TopicDetailRoot.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// Tibug 博文
diff --git a/Blog.Core.Model/Models/RootTkey/UserRoleRoot.cs b/Blog.Core.Model/Base/RootTkey/UserRoleRoot.cs
similarity index 90%
rename from Blog.Core.Model/Models/RootTkey/UserRoleRoot.cs
rename to Blog.Core.Model/Base/RootTkey/UserRoleRoot.cs
index f4cd4a58..bb968c7f 100644
--- a/Blog.Core.Model/Models/RootTkey/UserRoleRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/UserRoleRoot.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 用户跟角色关联表
diff --git a/Blog.Core.Model/Models/RootTkey/sysUserInfoRoot.cs b/Blog.Core.Model/Base/RootTkey/sysUserInfoRoot.cs
similarity index 81%
rename from Blog.Core.Model/Models/RootTkey/sysUserInfoRoot.cs
rename to Blog.Core.Model/Base/RootTkey/sysUserInfoRoot.cs
index 60531b1c..3ce4a2d9 100644
--- a/Blog.Core.Model/Models/RootTkey/sysUserInfoRoot.cs
+++ b/Blog.Core.Model/Base/RootTkey/sysUserInfoRoot.cs
@@ -1,8 +1,4 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model.Base.RootTkey
 {
     /// <summary>
     /// 用户信息表
diff --git a/Blog.Core.Model/Tenants/ITenantEntity.cs b/Blog.Core.Model/Base/Tenants/ITenantEntity.cs
similarity index 79%
rename from Blog.Core.Model/Tenants/ITenantEntity.cs
rename to Blog.Core.Model/Base/Tenants/ITenantEntity.cs
index 2d0c5dc9..f6f05bd9 100644
--- a/Blog.Core.Model/Tenants/ITenantEntity.cs
+++ b/Blog.Core.Model/Base/Tenants/ITenantEntity.cs
@@ -1,6 +1,4 @@
-using SqlSugar;
-
-namespace Blog.Core.Model.Tenants;
+namespace Blog.Core.Model.Base.Tenants;
 
 /// <summary>
 /// 租户模型接口
diff --git a/Blog.Core.Model/Tenants/MultiTenantAttribute.cs b/Blog.Core.Model/Base/Tenants/MultiTenantAttribute.cs
similarity index 90%
rename from Blog.Core.Model/Tenants/MultiTenantAttribute.cs
rename to Blog.Core.Model/Base/Tenants/MultiTenantAttribute.cs
index 443745bf..887a43bc 100644
--- a/Blog.Core.Model/Tenants/MultiTenantAttribute.cs
+++ b/Blog.Core.Model/Base/Tenants/MultiTenantAttribute.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model.Tenants;
+namespace Blog.Core.Model.Base.Tenants;
 
 /// <summary>
 /// 标识 多租户 的业务表 <br/>
diff --git a/Blog.Core.Model/Tenants/TenantTypeEnum.cs b/Blog.Core.Model/Base/Tenants/TenantTypeEnum.cs
similarity index 91%
rename from Blog.Core.Model/Tenants/TenantTypeEnum.cs
rename to Blog.Core.Model/Base/Tenants/TenantTypeEnum.cs
index f4af3bda..aa30e8c2 100644
--- a/Blog.Core.Model/Tenants/TenantTypeEnum.cs
+++ b/Blog.Core.Model/Base/Tenants/TenantTypeEnum.cs
@@ -1,6 +1,6 @@
 using System.ComponentModel;
 
-namespace Blog.Core.Model.Tenants;
+namespace Blog.Core.Model.Base.Tenants;
 
 /// <summary>
 /// 租户隔离方案
diff --git a/Blog.Core.Model/Blog.Core.Model.csproj b/Blog.Core.Model/Blog.Core.Model.csproj
index fb04c45c..9ea45849 100644
--- a/Blog.Core.Model/Blog.Core.Model.csproj
+++ b/Blog.Core.Model/Blog.Core.Model.csproj
@@ -19,7 +19,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
-	  <Folder Include="Models\RootTkey\Interface\" />
+	  <ProjectReference Include="..\Blog.Core.Migrate\Blog.Core.Migrate.csproj" />
 	</ItemGroup>
 
 </Project>
diff --git a/Blog.Core.Model/CustomEnums/AuthorityScopeEnum.cs b/Blog.Core.Model/CustomEnums/AuthorityScopeEnum.cs
index 422b2c56..d6632b54 100644
--- a/Blog.Core.Model/CustomEnums/AuthorityScopeEnum.cs
+++ b/Blog.Core.Model/CustomEnums/AuthorityScopeEnum.cs
@@ -1,4 +1,4 @@
-namespace Blog.Core.Model
+namespace Blog.Core.Model.CustomEnums
 {
     public enum AuthorityScopeEnum
     {
diff --git a/Blog.Core.Model/GlobalUsings.cs b/Blog.Core.Model/GlobalUsings.cs
new file mode 100644
index 00000000..55069d54
--- /dev/null
+++ b/Blog.Core.Model/GlobalUsings.cs
@@ -0,0 +1,9 @@
+// global using 指令
+
+global using System;
+global using System.Collections.Generic;
+global using System.Text;
+global using Blog.Core.Migrate.Attributes;
+global using Blog.Core.Model.Base;
+global using Blog.Core.Model.Base.RootTkey;
+global using SqlSugar;
\ No newline at end of file
diff --git a/Blog.Core.Model/HttpEnum.cs b/Blog.Core.Model/HttpEnum.cs
index 05e25582..e5ef4b3a 100644
--- a/Blog.Core.Model/HttpEnum.cs
+++ b/Blog.Core.Model/HttpEnum.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model
 {
     public enum HttpEnum
     {
diff --git a/Blog.Core.Model/IDS4DbModels/ApplicationRole.cs b/Blog.Core.Model/IDS4DbModels/ApplicationRole.cs
index 8baf76ea..420f3275 100644
--- a/Blog.Core.Model/IDS4DbModels/ApplicationRole.cs
+++ b/Blog.Core.Model/IDS4DbModels/ApplicationRole.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.IDS4DbModels
+namespace Blog.Core.Model.IDS4DbModels
 {
     /// <summary>
     /// 以下model 来自ids4项目,多库模式,为了调取ids4数据
diff --git a/Blog.Core.Model/IDS4DbModels/ApplicationUser.cs b/Blog.Core.Model/IDS4DbModels/ApplicationUser.cs
index 50529166..d53b9078 100644
--- a/Blog.Core.Model/IDS4DbModels/ApplicationUser.cs
+++ b/Blog.Core.Model/IDS4DbModels/ApplicationUser.cs
@@ -1,7 +1,4 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.IDS4DbModels
+namespace Blog.Core.Model.IDS4DbModels
 {
     /// <summary>
     /// 以下model 来自ids4项目,多库模式,为了调取ids4数据
diff --git a/Blog.Core.Model/Logs/AuditSqlLog.cs b/Blog.Core.Model/Logs/AuditSqlLog.cs
index f4b28195..4e17956f 100644
--- a/Blog.Core.Model/Logs/AuditSqlLog.cs
+++ b/Blog.Core.Model/Logs/AuditSqlLog.cs
@@ -1,11 +1,9 @@
-using Blog.Core.Model.Base;
-using SqlSugar;
-
-namespace Blog.Core.Model.Logs;
+namespace Blog.Core.Model.Logs;
 
 [Tenant("log")]
 [SplitTable(SplitType.Month)] //按月分表 (自带分表支持 年、季、月、周、日)
 [SugarTable($@"{nameof(AuditSqlLog)}_{{year}}{{month}}{{day}}")]
+[MigrateVersion("1.0.0")]
 public class AuditSqlLog: BaseLog
 {
     
diff --git a/Blog.Core.Model/Logs/GlobalErrorLog.cs b/Blog.Core.Model/Logs/GlobalErrorLog.cs
index cea55642..63efbd95 100644
--- a/Blog.Core.Model/Logs/GlobalErrorLog.cs
+++ b/Blog.Core.Model/Logs/GlobalErrorLog.cs
@@ -1,11 +1,9 @@
-using Blog.Core.Model.Base;
-using SqlSugar;
-
-namespace Blog.Core.Model.Logs;
+namespace Blog.Core.Model.Logs;
 
 [Tenant("log")]
 [SplitTable(SplitType.Month)] //按月分表 (自带分表支持 年、季、月、周、日)
 [SugarTable($@"{nameof(GlobalErrorLog)}_{{year}}{{month}}{{day}}")]
+[MigrateVersion("1.0.0")]
 public class GlobalErrorLog : BaseLog
 {
     [SugarColumn(IsNullable = true, ColumnDataType = "longtext,text,clob")]
diff --git a/Blog.Core.Model/Logs/GlobalInformationLog.cs b/Blog.Core.Model/Logs/GlobalInformationLog.cs
index 9e627acb..147ea3ea 100644
--- a/Blog.Core.Model/Logs/GlobalInformationLog.cs
+++ b/Blog.Core.Model/Logs/GlobalInformationLog.cs
@@ -1,11 +1,9 @@
-using Blog.Core.Model.Base;
-using SqlSugar;
-
-namespace Blog.Core.Model.Logs;
+namespace Blog.Core.Model.Logs;
 
 [Tenant("log")]
 [SplitTable(SplitType.Month)] //按月分表 (自带分表支持 年、季、月、周、日)
 [SugarTable($@"{nameof(GlobalInformationLog)}_{{year}}{{month}}{{day}}")]
+[MigrateVersion("1.0.0")]
 public class GlobalInformationLog : BaseLog
 {
 
diff --git a/Blog.Core.Model/Logs/GlobalWarningLog.cs b/Blog.Core.Model/Logs/GlobalWarningLog.cs
index 36d8545e..9403b7ce 100644
--- a/Blog.Core.Model/Logs/GlobalWarningLog.cs
+++ b/Blog.Core.Model/Logs/GlobalWarningLog.cs
@@ -1,11 +1,9 @@
-using Blog.Core.Model.Base;
-using SqlSugar;
-
-namespace Blog.Core.Model.Logs;
+namespace Blog.Core.Model.Logs;
 
 [Tenant("log")]
 [SplitTable(SplitType.Month)] //按月分表 (自带分表支持 年、季、月、周、日)
 [SugarTable($@"{nameof(GlobalWarningLog)}_{{year}}{{month}}{{day}}")]
+[MigrateVersion("1.0.0")]
 public class GlobalWarningLog: BaseLog
 {
     
diff --git a/Blog.Core.Model/Models/AccessTrendLog.cs b/Blog.Core.Model/Models/AccessTrendLog.cs
index bc4848cf..0a9e5446 100644
--- a/Blog.Core.Model/Models/AccessTrendLog.cs
+++ b/Blog.Core.Model/Models/AccessTrendLog.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 用户访问趋势日志
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class AccessTrendLog : RootEntityTkey<long>
     {
         /// <summary>
diff --git a/Blog.Core.Model/Models/Advertisement.cs b/Blog.Core.Model/Models/Advertisement.cs
index 3b11b21f..fb6b7fe8 100644
--- a/Blog.Core.Model/Models/Advertisement.cs
+++ b/Blog.Core.Model/Models/Advertisement.cs
@@ -1,8 +1,6 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
+    [MigrateVersion("1.0.0")]
     public class Advertisement : RootEntityTkey<long>
     {
 
diff --git a/Blog.Core.Model/Models/BlogArticle.cs b/Blog.Core.Model/Models/BlogArticle.cs
index 8b75c8df..c1d839b9 100644
--- a/Blog.Core.Model/Models/BlogArticle.cs
+++ b/Blog.Core.Model/Models/BlogArticle.cs
@@ -1,12 +1,9 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 博客文章
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class BlogArticle
     {
         /// <summary>
diff --git a/Blog.Core.Model/Models/BlogArticleComment.cs b/Blog.Core.Model/Models/BlogArticleComment.cs
index 519fb003..8464d286 100644
--- a/Blog.Core.Model/Models/BlogArticleComment.cs
+++ b/Blog.Core.Model/Models/BlogArticleComment.cs
@@ -1,10 +1,9 @@
-using SqlSugar;
-
-namespace Blog.Core.Model.Models;
+namespace Blog.Core.Model.Models;
 
 /// <summary>
 /// 博客文章 评论
 /// </summary>
+[MigrateVersion("1.0.0")]
 public class BlogArticleComment : RootEntityTkey<long>
 {
     public long bID { get; set; }
diff --git a/Blog.Core.Model/Models/Department.cs b/Blog.Core.Model/Models/Department.cs
index 424bcf44..d91e9ae6 100644
--- a/Blog.Core.Model/Models/Department.cs
+++ b/Blog.Core.Model/Models/Department.cs
@@ -1,12 +1,9 @@
-using SqlSugar;
-using System;
-
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     ///<summary>
     /// 部门表
     ///</summary>
+    [MigrateVersion("1.0.0")]
     public class Department : DepartmentRoot<long>
     {
         /// <summary>
diff --git a/Blog.Core.Model/Models/GblLogAudit.cs b/Blog.Core.Model/Models/GblLogAudit.cs
index d4a85411..b203a467 100644
--- a/Blog.Core.Model/Models/GblLogAudit.cs
+++ b/Blog.Core.Model/Models/GblLogAudit.cs
@@ -1,12 +1,10 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 用户团队表
     /// </summary>
     [SugarTable("GblLogAudit", TableDescription = "日志审计")]
+    [MigrateVersion("1.0.0")]
     public class GblLogAudit
     {
         ///<summary>
diff --git a/Blog.Core.Model/Models/Guestbook.cs b/Blog.Core.Model/Models/Guestbook.cs
index 0cd5dcef..429fc085 100644
--- a/Blog.Core.Model/Models/Guestbook.cs
+++ b/Blog.Core.Model/Models/Guestbook.cs
@@ -1,8 +1,6 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
+    [MigrateVersion("1.0.0")]
     public class Guestbook : RootEntityTkey<long>
     {
 
diff --git a/Blog.Core.Model/Models/Modules.cs b/Blog.Core.Model/Models/Modules.cs
index 684cfcd0..a986b5d0 100644
--- a/Blog.Core.Model/Models/Modules.cs
+++ b/Blog.Core.Model/Models/Modules.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 接口API地址信息表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class Modules : ModulesRoot<long>
     {
         public Modules()
diff --git a/Blog.Core.Model/Models/OperateLog.cs b/Blog.Core.Model/Models/OperateLog.cs
index 3c2fb54c..8f509f50 100644
--- a/Blog.Core.Model/Models/OperateLog.cs
+++ b/Blog.Core.Model/Models/OperateLog.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 日志记录
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class OperateLog : RootEntityTkey<long>
     {
 
diff --git a/Blog.Core.Model/Models/PasswordLib.cs b/Blog.Core.Model/Models/PasswordLib.cs
index 2037df4d..6bbdf491 100644
--- a/Blog.Core.Model/Models/PasswordLib.cs
+++ b/Blog.Core.Model/Models/PasswordLib.cs
@@ -1,13 +1,11 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 密码库表
     /// </summary>
     [SugarTable("PasswordLib", "密码库表")]//('数据库表名','数据库表备注')
     //[TenantAttribute("WMBLOG_MYSQL_2")] //('代表是哪个数据库,名字是appsettings.json 的 ConnId')
+    [MigrateVersion("1.0.0")]
     public class PasswordLib
     {
         [SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = false)]
diff --git a/Blog.Core.Model/Models/Permission.cs b/Blog.Core.Model/Models/Permission.cs
index 95a46b85..b41e555d 100644
--- a/Blog.Core.Model/Models/Permission.cs
+++ b/Blog.Core.Model/Models/Permission.cs
@@ -1,12 +1,9 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 路由菜单表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class Permission : PermissionRoot<long>
     {
         public Permission()
diff --git a/Blog.Core.Model/Models/Role.cs b/Blog.Core.Model/Models/Role.cs
index 0e65bcaf..993c7043 100644
--- a/Blog.Core.Model/Models/Role.cs
+++ b/Blog.Core.Model/Models/Role.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 角色表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class Role : RootEntityTkey<long>
     {
         public Role()
diff --git a/Blog.Core.Model/Models/RoleModulePermission.cs b/Blog.Core.Model/Models/RoleModulePermission.cs
index f33c1080..38c2535f 100644
--- a/Blog.Core.Model/Models/RoleModulePermission.cs
+++ b/Blog.Core.Model/Models/RoleModulePermission.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 按钮跟权限关联表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class RoleModulePermission : RoleModulePermissionRoot<long>
     {
         public RoleModulePermission()
diff --git a/Blog.Core.Model/Models/SplitDemo.cs b/Blog.Core.Model/Models/SplitDemo.cs
index 75154038..e1124957 100644
--- a/Blog.Core.Model/Models/SplitDemo.cs
+++ b/Blog.Core.Model/Models/SplitDemo.cs
@@ -1,9 +1,5 @@
 using Newtonsoft.Json;
-using SqlSugar;
-using System;
-using System.Collections.Generic;
 using System.Linq;
-using System.Text;
 using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 
@@ -11,6 +7,7 @@ namespace Blog.Core.Model.Models
 {
     [SplitTable(SplitType.Day)]//按天分表 (自带分表支持 年、季、月、周、日)
     [SugarTable("SplitDemo_{year}{month}{day}")]//3个变量必须要有,这么设计为了兼容开始按年,后面改成按月、按日
+    [MigrateVersion("1.0.0")]
     public class SplitDemo
     {
         [SugarColumn(IsPrimaryKey = true)]
diff --git a/Blog.Core.Model/Models/SysTenant.cs b/Blog.Core.Model/Models/SysTenant.cs
index 61d03866..7fc395b9 100644
--- a/Blog.Core.Model/Models/SysTenant.cs
+++ b/Blog.Core.Model/Models/SysTenant.cs
@@ -1,5 +1,4 @@
-using Blog.Core.Model.Tenants;
-using SqlSugar;
+using Blog.Core.Model.Base.Tenants;
 
 namespace Blog.Core.Model.Models;
 
@@ -14,6 +13,7 @@ namespace Blog.Core.Model.Models;
 /// 注意:<br/>
 /// 使用租户Id方案,无需配置分库的连接
 /// </summary>
+[MigrateVersion("1.0.0")]
 public class SysTenant : RootEntityTkey<long>
 {
     /// <summary>
diff --git a/Blog.Core.Model/Models/TasksLog.cs b/Blog.Core.Model/Models/TasksLog.cs
index c79e8077..2234cf49 100644
--- a/Blog.Core.Model/Models/TasksLog.cs
+++ b/Blog.Core.Model/Models/TasksLog.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 任务日志表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class TasksLog : RootEntityTkey<long>
     {
         /// <summary>
diff --git a/Blog.Core.Model/Models/TasksQz.cs b/Blog.Core.Model/Models/TasksQz.cs
index b029a995..89283adb 100644
--- a/Blog.Core.Model/Models/TasksQz.cs
+++ b/Blog.Core.Model/Models/TasksQz.cs
@@ -1,13 +1,11 @@
 using Blog.Core.Model.ViewModels;
-using SqlSugar;
-using System;
-using System.Collections.Generic;
 
 namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 任务计划表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class TasksQz : RootEntityTkey<long>
     {
         /// <summary>
diff --git a/Blog.Core.Model/Models/Tenant/BusinessTable.cs b/Blog.Core.Model/Models/Tenant/BusinessTable.cs
index b3b0140a..eed33697 100644
--- a/Blog.Core.Model/Models/Tenant/BusinessTable.cs
+++ b/Blog.Core.Model/Models/Tenant/BusinessTable.cs
@@ -1,12 +1,12 @@
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Tenants;
+using Blog.Core.Model.Base.Tenants;
 
-namespace Blog.Core.Model.Models;
+namespace Blog.Core.Model.Models.Tenant;
 
 /// <summary>
 /// 业务数据 <br/>
 /// 多租户 (Id 隔离)
 /// </summary>
+[MigrateVersion("1.0.0")]
 public class BusinessTable : BaseEntity, ITenantEntity
 {
     /// <summary>
diff --git a/Blog.Core.Model/Models/Tenant/MultiBusinessSubTable.cs b/Blog.Core.Model/Models/Tenant/MultiBusinessSubTable.cs
index 1ada394d..707bdf20 100644
--- a/Blog.Core.Model/Models/Tenant/MultiBusinessSubTable.cs
+++ b/Blog.Core.Model/Models/Tenant/MultiBusinessSubTable.cs
@@ -1,12 +1,12 @@
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Tenants;
+using Blog.Core.Model.Base.Tenants;
 
-namespace Blog.Core.Model.Models;
+namespace Blog.Core.Model.Models.Tenant;
 
 /// <summary>
 /// 多租户-多表方案 业务表 子表 <br/>
 /// </summary>
 [MultiTenant(TenantTypeEnum.Tables)]
+[MigrateVersion("1.0.0")]
 public class MultiBusinessSubTable : BaseEntity
 {
     public long MainId { get; set; }
diff --git a/Blog.Core.Model/Models/Tenant/MultiBusinessTable.cs b/Blog.Core.Model/Models/Tenant/MultiBusinessTable.cs
index 619bdaaf..2709b25e 100644
--- a/Blog.Core.Model/Models/Tenant/MultiBusinessTable.cs
+++ b/Blog.Core.Model/Models/Tenant/MultiBusinessTable.cs
@@ -1,14 +1,12 @@
-using System.Collections.Generic;
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Tenants;
-using SqlSugar;
+using Blog.Core.Model.Base.Tenants;
 
-namespace Blog.Core.Model.Models;
+namespace Blog.Core.Model.Models.Tenant;
 
 /// <summary>
 /// 多租户-多表方案 业务表 <br/>
 /// </summary>
 [MultiTenant(TenantTypeEnum.Tables)]
+[MigrateVersion("1.0.1")]
 public class MultiBusinessTable : BaseEntity
 {
     /// <summary>
@@ -21,6 +19,12 @@ public class MultiBusinessTable : BaseEntity
     /// </summary>
     public decimal Amount { get; set; }
 
+    /// <summary>
+    /// 备注(测试增加字段,多表迁移)
+    /// </summary>
+    [SugarColumn(IsNullable = true)]
+    public string Remark { get; set; }
+
     [Navigate(NavigateType.OneToMany, nameof(MultiBusinessSubTable.MainId))]
     public List<MultiBusinessSubTable> Child { get; set; }
 }
\ No newline at end of file
diff --git a/Blog.Core.Model/Models/Tenant/SubLibraryBusinessTable.cs b/Blog.Core.Model/Models/Tenant/SubLibraryBusinessTable.cs
index 446fb436..82700dc4 100644
--- a/Blog.Core.Model/Models/Tenant/SubLibraryBusinessTable.cs
+++ b/Blog.Core.Model/Models/Tenant/SubLibraryBusinessTable.cs
@@ -1,13 +1,13 @@
-using Blog.Core.Model.Models.RootTkey;
-using Blog.Core.Model.Tenants;
+using Blog.Core.Model.Base.Tenants;
 
-namespace Blog.Core.Model.Models;
+namespace Blog.Core.Model.Models.Tenant;
 
 /// <summary>
 /// 多租户-多库方案 业务表 <br/>
 /// 公共库无需标记[MultiTenant]特性
 /// </summary>
 [MultiTenant]
+[MigrateVersion("1.0.1")]
 public class SubLibraryBusinessTable : BaseEntity
 {
     /// <summary>
@@ -19,4 +19,10 @@ public class SubLibraryBusinessTable : BaseEntity
     /// 金额
     /// </summary>
     public decimal Amount { get; set; }
+
+    /// <summary>
+    /// 备注(测试增加字段,多库迁移)
+    /// </summary>
+    [SugarColumn(IsNullable = true)]
+    public string Remark { get; set; }
 }
\ No newline at end of file
diff --git a/Blog.Core.Model/Models/TestModels.cs b/Blog.Core.Model/Models/TestModels.cs
index 8a8d123c..ab487592 100644
--- a/Blog.Core.Model/Models/TestModels.cs
+++ b/Blog.Core.Model/Models/TestModels.cs
@@ -1,6 +1,6 @@
 namespace Blog.Core.Model.Models
 {
-
+    [MigrateVersion("1.0.0")]
     public class TestMuchTableResult
     {
         public string moduleName { get; set; }
diff --git a/Blog.Core.Model/Models/Topic.cs b/Blog.Core.Model/Models/Topic.cs
index e57bd561..7cf8b5ab 100644
--- a/Blog.Core.Model/Models/Topic.cs
+++ b/Blog.Core.Model/Models/Topic.cs
@@ -1,12 +1,9 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// Tibug 类别
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class Topic : RootEntityTkey<long>
     {
         public Topic()
diff --git a/Blog.Core.Model/Models/TopicDetail.cs b/Blog.Core.Model/Models/TopicDetail.cs
index 6cb69c67..8a8aaadf 100644
--- a/Blog.Core.Model/Models/TopicDetail.cs
+++ b/Blog.Core.Model/Models/TopicDetail.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// Tibug 博文
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class TopicDetail : TopicDetailRoot<long>
     {
         public TopicDetail()
diff --git a/Blog.Core.Model/Models/UserRole.cs b/Blog.Core.Model/Models/UserRole.cs
index 7ed9c6be..630ea5b5 100644
--- a/Blog.Core.Model/Models/UserRole.cs
+++ b/Blog.Core.Model/Models/UserRole.cs
@@ -1,11 +1,9 @@
-using SqlSugar;
-using System;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
     /// <summary>
     /// 用户跟角色关联表
     /// </summary>
+    [MigrateVersion("1.0.0")]
     public class UserRole : UserRoleRoot<long>
     {
         public UserRole() { }
diff --git a/Blog.Core.Model/Models/WeChatCompany.cs b/Blog.Core.Model/Models/WeChatCompany.cs
index d07d4208..ad2cbb14 100644
--- a/Blog.Core.Model/Models/WeChatCompany.cs
+++ b/Blog.Core.Model/Models/WeChatCompany.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatCompany")]
+    [MigrateVersion("1.0.0")]
     public partial class WeChatCompany
     {
 
diff --git a/Blog.Core.Model/Models/WeChatConfig.cs b/Blog.Core.Model/Models/WeChatConfig.cs
index 16910487..fd57335e 100644
--- a/Blog.Core.Model/Models/WeChatConfig.cs
+++ b/Blog.Core.Model/Models/WeChatConfig.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatConfig")]
+    [MigrateVersion("1.0.0")]
     public class WeChatConfig
     {
 
diff --git a/Blog.Core.Model/Models/WeChatPushLog.cs b/Blog.Core.Model/Models/WeChatPushLog.cs
index 5368c806..d47298d3 100644
--- a/Blog.Core.Model/Models/WeChatPushLog.cs
+++ b/Blog.Core.Model/Models/WeChatPushLog.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatPushLog")]
+    [MigrateVersion("1.0.0")]
     public partial class WeChatPushLog
     {
 
diff --git a/Blog.Core.Model/Models/WeChatQR.cs b/Blog.Core.Model/Models/WeChatQR.cs
index 06ea8684..8a1f73fe 100644
--- a/Blog.Core.Model/Models/WeChatQR.cs
+++ b/Blog.Core.Model/Models/WeChatQR.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatQR")]
+    [MigrateVersion("1.0.0")]
     public partial class WeChatQR
     {
 
diff --git a/Blog.Core.Model/Models/WeChatSub.cs b/Blog.Core.Model/Models/WeChatSub.cs
index 48787a5f..da9652e5 100644
--- a/Blog.Core.Model/Models/WeChatSub.cs
+++ b/Blog.Core.Model/Models/WeChatSub.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatSub")]
+    [MigrateVersion("1.0.0")]
     public partial class WeChatSub
     {
         [SugarColumn(IsNullable = false,IsPrimaryKey = true)]
diff --git a/Blog.Core.Model/Models/WeChatUploadFile.cs b/Blog.Core.Model/Models/WeChatUploadFile.cs
index f7b979de..8ebe1a7a 100644
--- a/Blog.Core.Model/Models/WeChatUploadFile.cs
+++ b/Blog.Core.Model/Models/WeChatUploadFile.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Linq;
-using System.Text;
-using SqlSugar;
+using System.Linq;
 
 namespace Blog.Core.Model.Models
 {
@@ -9,6 +6,7 @@ namespace Blog.Core.Model.Models
     ///
     ///</summary>
     [SugarTable("WeChatUploadFile")]
+    [MigrateVersion("1.0.0")]
     public partial class WeChatUploadFile
     {
 
diff --git a/Blog.Core.Model/Models/sysUserInfo.cs b/Blog.Core.Model/Models/sysUserInfo.cs
index 1137d91c..2f54ecea 100644
--- a/Blog.Core.Model/Models/sysUserInfo.cs
+++ b/Blog.Core.Model/Models/sysUserInfo.cs
@@ -1,14 +1,11 @@
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.Models
+namespace Blog.Core.Model.Models
 {
 	/// <summary>
 	/// 用户信息表
 	/// </summary>
 	//[SugarTable("SysUserInfo")]
 	[SugarTable("SysUserInfo", "用户表")] //('数据库表名','数据库表备注')
+	[MigrateVersion("1.0.0")]
 	public class SysUserInfo : SysUserInfoRoot<long>
 	{
 		public SysUserInfo()
diff --git a/Blog.Core.Model/PageModel.cs b/Blog.Core.Model/PageModel.cs
index f6872b66..589912b8 100644
--- a/Blog.Core.Model/PageModel.cs
+++ b/Blog.Core.Model/PageModel.cs
@@ -1,6 +1,4 @@
 using AutoMapper;
-using System;
-using System.Collections.Generic;
 
 namespace Blog.Core.Model
 {
diff --git a/Blog.Core.Model/Systems/DataBase/DatabaseOutput.cs b/Blog.Core.Model/Systems/DataBase/DatabaseOutput.cs
index 8cefaeb6..7befc353 100644
--- a/Blog.Core.Model/Systems/DataBase/DatabaseOutput.cs
+++ b/Blog.Core.Model/Systems/DataBase/DatabaseOutput.cs
@@ -1,6 +1,4 @@
-using SqlSugar;
-
-namespace Blog.Core.Model.Systems.DataBase;
+namespace Blog.Core.Model.Systems.DataBase;
 
 public class DatabaseOutput
 {
diff --git a/Blog.Core.Model/TableModel.cs b/Blog.Core.Model/TableModel.cs
index 289e9c8c..296f26e4 100644
--- a/Blog.Core.Model/TableModel.cs
+++ b/Blog.Core.Model/TableModel.cs
@@ -1,6 +1,4 @@
-using System.Collections.Generic;
-
-namespace Blog.Core.Model
+namespace Blog.Core.Model
 {
     /// <summary>
     /// 表格数据,支持分页
diff --git a/Blog.Core.Model/ViewModels/AdvertisementViewModels.cs b/Blog.Core.Model/ViewModels/AdvertisementViewModels.cs
index 81a1974a..1e6958dc 100644
--- a/Blog.Core.Model/ViewModels/AdvertisementViewModels.cs
+++ b/Blog.Core.Model/ViewModels/AdvertisementViewModels.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 广告类
diff --git a/Blog.Core.Model/ViewModels/BlogViewModels.cs b/Blog.Core.Model/ViewModels/BlogViewModels.cs
index 86c16618..5cce99da 100644
--- a/Blog.Core.Model/ViewModels/BlogViewModels.cs
+++ b/Blog.Core.Model/ViewModels/BlogViewModels.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 博客信息展示类
diff --git a/Blog.Core.Model/ViewModels/EnumDemoDto.cs b/Blog.Core.Model/ViewModels/EnumDemoDto.cs
index ae6ffbdd..c2a11c7d 100644
--- a/Blog.Core.Model/ViewModels/EnumDemoDto.cs
+++ b/Blog.Core.Model/ViewModels/EnumDemoDto.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Linq;
 using System.Threading.Tasks;
 
 namespace Blog.Core.Model.ViewModels
diff --git a/Blog.Core.Model/ViewModels/GuestbookViewModels.cs b/Blog.Core.Model/ViewModels/GuestbookViewModels.cs
index 1729bdb4..0a03d5b7 100644
--- a/Blog.Core.Model/ViewModels/GuestbookViewModels.cs
+++ b/Blog.Core.Model/ViewModels/GuestbookViewModels.cs
@@ -1,5 +1,4 @@
-using System;
-using Blog.Core.Model.Models;
+using Blog.Core.Model.Models;
 
 namespace Blog.Core.Model.ViewModels
 {
diff --git a/Blog.Core.Model/ViewModels/PayReturnResultModel.cs b/Blog.Core.Model/ViewModels/PayReturnResultModel.cs
index 4cb8b624..db8c58b7 100644
--- a/Blog.Core.Model/ViewModels/PayReturnResultModel.cs
+++ b/Blog.Core.Model/ViewModels/PayReturnResultModel.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Linq;
 using System.Threading.Tasks;
 
 namespace Blog.Core.Model.ViewModels
diff --git a/Blog.Core.Model/ViewModels/RootTKey/SysUserInfoDtoRoot.cs b/Blog.Core.Model/ViewModels/RootTKey/SysUserInfoDtoRoot.cs
index bcccb8e7..260f5d9a 100644
--- a/Blog.Core.Model/ViewModels/RootTKey/SysUserInfoDtoRoot.cs
+++ b/Blog.Core.Model/ViewModels/RootTKey/SysUserInfoDtoRoot.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels.RootTKey
 {
     public class SysUserInfoDtoRoot<Tkey> where Tkey : IEquatable<Tkey>
     {
diff --git a/Blog.Core.Model/ViewModels/SidebarMenuViewModel.cs b/Blog.Core.Model/ViewModels/SidebarMenuViewModel.cs
index d098f397..6c8ef6cd 100644
--- a/Blog.Core.Model/ViewModels/SidebarMenuViewModel.cs
+++ b/Blog.Core.Model/ViewModels/SidebarMenuViewModel.cs
@@ -1,6 +1,4 @@
-using System.Collections.Generic;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 菜单展示model
diff --git a/Blog.Core.Model/ViewModels/SysUserInfoDto.cs b/Blog.Core.Model/ViewModels/SysUserInfoDto.cs
index 3b5451f0..28cdf030 100644
--- a/Blog.Core.Model/ViewModels/SysUserInfoDto.cs
+++ b/Blog.Core.Model/ViewModels/SysUserInfoDto.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using Blog.Core.Model.ViewModels.RootTKey;
 
 namespace Blog.Core.Model.ViewModels
 {
diff --git a/Blog.Core.Model/ViewModels/TaskInfoDto.cs b/Blog.Core.Model/ViewModels/TaskInfoDto.cs
index 49b02085..164180f2 100644
--- a/Blog.Core.Model/ViewModels/TaskInfoDto.cs
+++ b/Blog.Core.Model/ViewModels/TaskInfoDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 调度任务触发器信息实体
diff --git a/Blog.Core.Model/ViewModels/WeChatApiDto.cs b/Blog.Core.Model/ViewModels/WeChatApiDto.cs
index e02a55b1..846ff4a3 100644
--- a/Blog.Core.Model/ViewModels/WeChatApiDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatApiDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信接口消息DTO
diff --git a/Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs b/Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs
index 2448bdd4..d1c6c0df 100644
--- a/Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信推送消息Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs b/Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs
index e90e5f47..62eb5ca9 100644
--- a/Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信推送消息Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs b/Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs
index 17db8c91..a85b3739 100644
--- a/Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 消息模板dto(如何填写数据,请参考微信模板即可)
diff --git a/Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs b/Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs
index df8952cd..2ade9d26 100644
--- a/Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 获取微信菜单DTO,用于存放具体菜单内容
diff --git a/Blog.Core.Model/ViewModels/WeChatMenuDto.cs b/Blog.Core.Model/ViewModels/WeChatMenuDto.cs
index 3015a2a7..462c0485 100644
--- a/Blog.Core.Model/ViewModels/WeChatMenuDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatMenuDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 获取微信菜单DTO
diff --git a/Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs b/Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs
index 93c13490..affe5d44 100644
--- a/Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信OpenID列表Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs b/Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs
index b203dacb..aaeaa7b1 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 推送详细数据
diff --git a/Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs b/Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs
index 588ee09c..68ccd018 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 推送给微信所需Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs b/Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs
index e9548fd8..97cfe516 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信keyword所需Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs b/Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs
index 064eaab4..40192895 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     public class WeChatPushLinkMsgContentDto
     {
diff --git a/Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs b/Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs
index 3b29681a..f0d8b780 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     public class WeChatPushPictureContentDto
     {
diff --git a/Blog.Core.Model/ViewModels/WeChatPushTestDto.cs b/Blog.Core.Model/ViewModels/WeChatPushTestDto.cs
index a906fb80..f18d5cab 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushTestDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushTestDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 推送模拟消息Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs b/Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs
index 55d6cc50..bc284cd4 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     public class WeChatPushTextContentDto
     {
diff --git a/Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs b/Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs
index a00ad6c1..02cd17e2 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     public class WeChatPushVideoContentDto
     {
diff --git a/Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs b/Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs
index 1a9da49f..6ad88549 100644
--- a/Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     public class WeChatPushVoiceContentDto
     {
diff --git a/Blog.Core.Model/ViewModels/WeChatQRActionDto.cs b/Blog.Core.Model/ViewModels/WeChatQRActionDto.cs
index 13001b6a..7d542d0a 100644
--- a/Blog.Core.Model/ViewModels/WeChatQRActionDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatQRActionDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信二维码预装发送信息dto
diff --git a/Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs b/Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs
index ba38072a..f61f8e33 100644
--- a/Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信二维码预装具体消息
diff --git a/Blog.Core.Model/ViewModels/WeChatQRDto.cs b/Blog.Core.Model/ViewModels/WeChatQRDto.cs
index eca876f3..b76c7325 100644
--- a/Blog.Core.Model/ViewModels/WeChatQRDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatQRDto.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信二维码预装信息DTO
diff --git a/Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs b/Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs
index 9d28fe51..ec1fd1e9 100644
--- a/Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs
+++ b/Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs
@@ -1,9 +1,4 @@
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 返回给调用者的Dto
diff --git a/Blog.Core.Model/ViewModels/WeChatUserInfo.cs b/Blog.Core.Model/ViewModels/WeChatUserInfo.cs
index faf65b1d..3546e77a 100644
--- a/Blog.Core.Model/ViewModels/WeChatUserInfo.cs
+++ b/Blog.Core.Model/ViewModels/WeChatUserInfo.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信推送所需信息(公司版本)
diff --git a/Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs b/Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs
index ef01aad2..aad252f0 100644
--- a/Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs
+++ b/Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Blog.Core.Model.ViewModels
+namespace Blog.Core.Model.ViewModels
 {
     /// <summary>
     /// 微信推送所需信息(OpenID版本)
diff --git a/Blog.Core.Model/ViewModels/WeChatValidDto.cs b/Blog.Core.Model/ViewModels/WeChatValidDto.cs
index c0d038df..b61dd47b 100644
--- a/Blog.Core.Model/ViewModels/WeChatValidDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatValidDto.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml.Serialization;
+using System.Xml.Serialization;
 
 namespace Blog.Core.Model.ViewModels
 {
diff --git a/Blog.Core.Model/ViewModels/WeChatXMLDto.cs b/Blog.Core.Model/ViewModels/WeChatXMLDto.cs
index e293849d..b5370470 100644
--- a/Blog.Core.Model/ViewModels/WeChatXMLDto.cs
+++ b/Blog.Core.Model/ViewModels/WeChatXMLDto.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
+using System.Xml;
 using System.Xml.Serialization;
 
 namespace Blog.Core.Model.ViewModels
diff --git a/Blog.Core.Repository/BASE/BaseRepository.cs b/Blog.Core.Repository/BASE/BaseRepository.cs
index 3a1c1ee8..3aa47fa4 100644
--- a/Blog.Core.Repository/BASE/BaseRepository.cs
+++ b/Blog.Core.Repository/BASE/BaseRepository.cs
@@ -3,7 +3,6 @@
 using Blog.Core.IRepository.Base;
 using Blog.Core.Model;
 using Blog.Core.Model.Models;
-using Blog.Core.Model.Tenants;
 using Blog.Core.Repository.UnitOfWorks;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
 using SqlSugar;
@@ -13,6 +12,7 @@
 using System.Linq.Expressions;
 using System.Reflection;
 using System.Threading.Tasks;
+using Blog.Core.Model.Base.Tenants;
 
 namespace Blog.Core.Repository.Base
 {
diff --git a/Blog.Core.Services/PayServices.cs b/Blog.Core.Services/PayServices.cs
index b257d088..3c1450fd 100644
--- a/Blog.Core.Services/PayServices.cs
+++ b/Blog.Core.Services/PayServices.cs
@@ -15,6 +15,7 @@
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using Blog.Core.Model.Base.RootTkey;
 
 namespace Blog.Core.Services
 {
diff --git a/Blog.Core.sln b/Blog.Core.sln
index 8814184f..1ec192f7 100644
--- a/Blog.Core.sln
+++ b/Blog.Core.sln
@@ -60,6 +60,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Provider.Nacos", "Oc
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blog.Core.Serilog", "Blog.Core.Serilog\Blog.Core.Serilog.csproj", "{7F9057F0-ED8D-4694-B590-7D75C012DF00}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blog.Core.Migrate", "Blog.Core.Migrate\Blog.Core.Migrate.csproj", "{33CA9C84-5B1E-4783-9BA5-DE342575014C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -126,6 +128,10 @@ Global
 		{7F9057F0-ED8D-4694-B590-7D75C012DF00}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7F9057F0-ED8D-4694-B590-7D75C012DF00}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7F9057F0-ED8D-4694-B590-7D75C012DF00}.Release|Any CPU.Build.0 = Release|Any CPU
+		{33CA9C84-5B1E-4783-9BA5-DE342575014C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{33CA9C84-5B1E-4783-9BA5-DE342575014C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{33CA9C84-5B1E-4783-9BA5-DE342575014C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{33CA9C84-5B1E-4783-9BA5-DE342575014C}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/Directory.Build.props b/Directory.Build.props
index 2934ef7e..c3a65cdf 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -2,5 +2,6 @@
     <PropertyGroup>
         <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
+        <LangVersion>default</LangVersion>
     </PropertyGroup>
 </Project>
\ No newline at end of file

From bdb7ca1ee3d38f82251a3603f6f9e1646e238659 Mon Sep 17 00:00:00 2001
From: LemonNoCry <ningmengbuku@outlook.com>
Date: Tue, 31 Dec 2024 15:10:15 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8E=A8=E4=BC=98=E5=8C=96=E8=B0=83?=
 =?UTF-8?q?=E6=95=B4=E8=BF=81=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Blog.Core.Api/Blog.Core.Model.xml | 1702 ++++++++++++++---------------
 Blog.Core.Api/Blog.Core.xml       |    6 +-
 Blog.Core.Common/Seed/DBSeed.cs   |    2 +-
 3 files changed, 855 insertions(+), 855 deletions(-)

diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml
index 1b1451c9..f286e4d8 100644
--- a/Blog.Core.Api/Blog.Core.Model.xml
+++ b/Blog.Core.Api/Blog.Core.Model.xml
@@ -4,1937 +4,1937 @@
         <name>Blog.Core.Model</name>
     </assembly>
     <members>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Enabled">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.Enabled">
             <summary>
             状态 <br/>
             中立字段,某些表可使用某些表不使用
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsDeleted">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.IsDeleted">
             <summary>
             中立字段,某些表可使用某些表不使用   <br/>
             逻辑上的删除,非物理删除  <br/>
             例如:单据删除并非直接删除
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.IsInternal">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.IsInternal">
             <summary>
             中立字段 <br/>
             是否内置数据
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateId">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.CreateId">
             <summary>
             创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateBy">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.CreateBy">
             <summary>
             创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.CreateTime">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.CreateTime">
             <summary>
             创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyId">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.ModifyId">
             <summary>
             修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyBy">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.ModifyBy">
             <summary>
             更新者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.ModifyTime">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.ModifyTime">
             <summary>
             修改日期
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RootTkey.BaseEntity.Version">
+        <member name="P:Blog.Core.Model.Base.RootTkey.BaseEntity.Version">
             <summary>
             数据版本
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.RootTkey.Interface.IDeleteFilter">
+        <member name="T:Blog.Core.Model.Base.RootTkey.DepartmentRoot`1">
             <summary>
-            软删除 过滤器
+            部门表
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.AccessTrendLog">
+        <member name="P:Blog.Core.Model.Base.RootTkey.DepartmentRoot`1.Pid">
             <summary>
-            用户访问趋势日志
+            上一级(0表示无上一级)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.AccessTrendLog.UserInfo">
+        <member name="T:Blog.Core.Model.Base.RootTkey.Interface.IDeleteFilter">
             <summary>
-            用户
+            软删除 过滤器
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.AccessTrendLog.Count">
+        <member name="T:Blog.Core.Model.Base.RootTkey.ModulesRoot`1">
             <summary>
-            次数
+            接口API地址信息表 
+            父类
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.AccessTrendLog.UpdateTime">
+        <member name="P:Blog.Core.Model.Base.RootTkey.ModulesRoot`1.ParentId">
             <summary>
-            更新时间
+            父ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Advertisement.ImgUrl">
+        <member name="T:Blog.Core.Model.Base.RootTkey.PermissionRoot`1">
             <summary>
-            广告图片
+            路由菜单表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Advertisement.Title">
+        <member name="P:Blog.Core.Model.Base.RootTkey.PermissionRoot`1.Pid">
             <summary>
-            广告标题
+            上一级菜单(0表示上一级无菜单)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Advertisement.Url">
+        <member name="P:Blog.Core.Model.Base.RootTkey.PermissionRoot`1.Mid">
             <summary>
-            广告链接
+            接口api
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Advertisement.Remark">
+        <member name="T:Blog.Core.Model.Base.RootTkey.RoleModulePermissionRoot`1">
             <summary>
-            备注
+            按钮跟权限关联表
+            父类
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Advertisement.Createdate">
+        <member name="P:Blog.Core.Model.Base.RootTkey.RoleModulePermissionRoot`1.RoleId">
             <summary>
-            创建时间
+            角色ID
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.BlogArticle">
+        <member name="P:Blog.Core.Model.Base.RootTkey.RoleModulePermissionRoot`1.ModuleId">
             <summary>
-            博客文章
+            菜单ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bID">
+        <member name="P:Blog.Core.Model.Base.RootTkey.RoleModulePermissionRoot`1.PermissionId">
             <summary>
-            主键
+            api ID
             </summary>
-            这里之所以没用RootEntity,是想保持和之前的数据库一致,主键是bID,不是Id
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bsubmitter">
+        <member name="P:Blog.Core.Model.Base.RootTkey.RootEntityTkey`1.Id">
             <summary>
-            创建人
+            ID
+            泛型主键Tkey
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.btitle">
+        <member name="T:Blog.Core.Model.Base.RootTkey.SysUserInfoRoot`1">
             <summary>
-            标题blog
+            用户信息表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bcategory">
+        <member name="P:Blog.Core.Model.Base.RootTkey.SysUserInfoRoot`1.Id">
             <summary>
-            类别
+            Id
+            泛型主键Tkey
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bcontent">
+        <member name="T:Blog.Core.Model.Base.RootTkey.TopicDetailRoot`1">
             <summary>
-            内容
+            Tibug 博文
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.btraffic">
+        <member name="T:Blog.Core.Model.Base.RootTkey.UserRoleRoot`1">
             <summary>
-            访问量
+            用户跟角色关联表
+            父类
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bcommentNum">
+        <member name="P:Blog.Core.Model.Base.RootTkey.UserRoleRoot`1.UserId">
             <summary>
-            评论数量
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bUpdateTime">
-            <summary> 
-            修改时间
+            用户ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bCreateTime">
+        <member name="P:Blog.Core.Model.Base.RootTkey.UserRoleRoot`1.RoleId">
             <summary>
-            创建时间
+            角色ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.bRemark">
+        <member name="T:Blog.Core.Model.Base.Tenants.ITenantEntity">
             <summary>
-            备注
+            租户模型接口
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.IsDeleted">
+        <member name="P:Blog.Core.Model.Base.Tenants.ITenantEntity.TenantId">
             <summary>
-            逻辑删除
+            租户Id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BlogArticle.Comments">
+        <member name="T:Blog.Core.Model.Base.Tenants.MultiTenantAttribute">
             <summary>
-            评论
+            标识 多租户 的业务表 <br/>
+            默认设置是多库       <br/>
+            公共表无需区分 直接使用主库 各自业务在各自库中 <br/>
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.BlogArticleComment">
+        <member name="T:Blog.Core.Model.Base.Tenants.TenantTypeEnum">
             <summary>
-            博客文章 评论
+            租户隔离方案
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.Department">
+        <member name="F:Blog.Core.Model.Base.Tenants.TenantTypeEnum.Id">
             <summary>
-             部门表
+            Id隔离
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.CodeRelationship">
+        <member name="F:Blog.Core.Model.Base.Tenants.TenantTypeEnum.Db">
             <summary>
-            Desc:部门关系编码
-            Default:
-            Nullable:True
+            库隔离
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.Name">
+        <member name="F:Blog.Core.Model.Base.Tenants.TenantTypeEnum.Tables">
             <summary>
-            Desc:部门名称
-            Default:
-            Nullable:True
+            表隔离
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.Leader">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.NONE">
             <summary>
-            Desc:负责人
-            Default:
-            Nullable:True
+            无任何权限
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.OrderSort">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.Custom">
             <summary>
-            Desc:排序
-            Default:
-            Nullable:True
+            自定义权限
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.Status">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.MyDepart">
             <summary>
-            Desc:部门状态(0正常 1停用)
-            Default:0
-            Nullable:True
+            本部门
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.IsDeleted">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.MyDepartAndDown">
             <summary>
-            Desc:删除标志(0代表存在 2代表删除)
-            Default:0
-            Nullable:True
+            本部门及以下
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.CreateBy">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.OnlySelf">
             <summary>
-            Desc:创建者
-            Default:
-            Nullable:True
+            仅自己
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.CreateTime">
+        <member name="F:Blog.Core.Model.CustomEnums.AuthorityScopeEnum.ALL">
             <summary>
-            Desc:创建时间
-            Default:
-            Nullable:True
+            所有
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.ModifyBy">
+        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationRole">
             <summary>
-            Desc:更新者
-            Default:
-            Nullable:True
+            以下model 来自ids4项目,多库模式,为了调取ids4数据
+            角色表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Department.ModifyTime">
-            <summary>
-            Desc:更新时间
-            Default:
-            Nullable:True
-            </summary>
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
+             <summary>
+            排序
+             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.GblLogAudit">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
             <summary>
-            用户团队表
+            是否激活
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Id">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
             <summary>
-            ID
+            创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.TraceId">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
             <summary>
-            HttpContext.TraceIdentifier 事件链路ID(获取或设置一个唯一标识符,用于在跟踪日志中表示此请求。)
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Date">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
             <summary>
-            时间
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Thread">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
             <summary>
-            线程
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Level">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
             <summary>
-            等级
+            修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Logger">
+        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
             <summary>
-            记录器
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.LogType">
+        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationUser">
             <summary>
-            日志类型
+            以下model 来自ids4项目,多库模式,为了调取ids4数据
+            用户表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.DataType">
+        <member name="T:Blog.Core.Model.Love">
             <summary>
-            数据类型
+            这是爱
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Message">
+        <member name="P:Blog.Core.Model.Love.Id">
             <summary>
-            错误信息
+            id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.GblLogAudit.Exception">
+        <member name="P:Blog.Core.Model.Love.Name">
             <summary>
-            异常
+            姓名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.blogId">
-            <summary>博客ID
-            
+        <member name="P:Blog.Core.Model.Love.Age">
+            <summary>
+            年龄
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.createdate">
-            <summary>创建时间
-            
+        <member name="T:Blog.Core.Model.MessageModel`1">
+            <summary>
+            通用返回信息类
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.phone">
-            <summary>手机
-            
+        <member name="P:Blog.Core.Model.MessageModel`1.status">
+            <summary>
+            状态码
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.QQ">
-            <summary>qq
-            
+        <member name="P:Blog.Core.Model.MessageModel`1.success">
+            <summary>
+            操作是否成功
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.body">
-            <summary>留言内容
-            
+        <member name="P:Blog.Core.Model.MessageModel`1.msg">
+            <summary>
+            返回信息
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.ip">
-            <summary>ip地址
-            
+        <member name="P:Blog.Core.Model.MessageModel`1.msgDev">
+            <summary>
+            开发者信息
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Guestbook.isshow">
-            <summary>是否显示在前台,0否1是
-            
+        <member name="P:Blog.Core.Model.MessageModel`1.response">
+            <summary>
+            返回数据集合
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.Modules">
+        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String)">
             <summary>
-            接口API地址信息表
+            返回成功
             </summary>
+            <param name="msg">消息</param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Name">
+        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String,`0)">
             <summary>
-            名称
+            返回成功
             </summary>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.LinkUrl">
+        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String)">
             <summary>
-            菜单链接地址
+            返回失败
             </summary>
+            <param name="msg">消息</param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Area">
+        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String,`0)">
             <summary>
-            区域名称
+            返回失败
             </summary>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Controller">
+        <member name="M:Blog.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
             <summary>
-            控制器名称
+            返回消息
             </summary>
+            <param name="success">失败/成功</param>
+            <param name="msg">消息</param>
+            <param name="response">数据</param>
+            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Action">
+        <member name="P:Blog.Core.Model.MessageModel.status">
             <summary>
-            Action名称
+            状态码
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Icon">
+        <member name="P:Blog.Core.Model.MessageModel.success">
             <summary>
-            图标
+            操作是否成功
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Code">
+        <member name="P:Blog.Core.Model.MessageModel.msg">
             <summary>
-            菜单编号
+            返回信息
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.OrderSort">
+        <member name="P:Blog.Core.Model.MessageModel.response">
             <summary>
-            排序
+            返回数据集合
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Description">
+        <member name="T:Blog.Core.Model.Models.AccessTrendLog">
             <summary>
-            /描述
+            用户访问趋势日志
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.IsMenu">
+        <member name="P:Blog.Core.Model.Models.AccessTrendLog.UserInfo">
             <summary>
-            是否是右侧菜单
+            用户
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.Enabled">
+        <member name="P:Blog.Core.Model.Models.AccessTrendLog.Count">
             <summary>
-            是否激活
+            次数
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.CreateId">
+        <member name="P:Blog.Core.Model.Models.AccessTrendLog.UpdateTime">
             <summary>
-            创建ID
+            更新时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.CreateBy">
+        <member name="P:Blog.Core.Model.Models.Advertisement.ImgUrl">
             <summary>
-            创建者
+            广告图片
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.CreateTime">
+        <member name="P:Blog.Core.Model.Models.Advertisement.Title">
             <summary>
-            创建时间
+            广告标题
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.ModifyId">
+        <member name="P:Blog.Core.Model.Models.Advertisement.Url">
             <summary>
-            修改ID
+            广告链接
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.Advertisement.Remark">
             <summary>
-            修改者
+            备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Modules.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.Advertisement.Createdate">
             <summary>
-            修改时间
+            创建时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.OperateLog">
+        <member name="T:Blog.Core.Model.Models.BlogArticle">
             <summary>
-            日志记录
+            博客文章
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.Area">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bID">
             <summary>
-            区域名
+            主键
             </summary>
+            这里之所以没用RootEntity,是想保持和之前的数据库一致,主键是bID,不是Id
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.Controller">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bsubmitter">
             <summary>
-            区域控制器名
+            创建人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.Action">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.btitle">
             <summary>
-            Action名称
+            标题blog
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.IPAddress">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bcategory">
             <summary>
-            IP地址
+            类别
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.Description">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bcontent">
             <summary>
-            描述
+            内容
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.LogTime">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.btraffic">
             <summary>
-            登录时间
+            访问量
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.LoginName">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bcommentNum">
             <summary>
-            登录名称
+            评论数量
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.OperateLog.UserId">
-            <summary>
-            用户ID
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bUpdateTime">
+            <summary> 
+            修改时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.PasswordLib">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bCreateTime">
             <summary>
-            密码库表
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.PasswordLib.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Models.Permission">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.bRemark">
             <summary>
-            路由菜单表
+            备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Code">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.IsDeleted">
             <summary>
-            菜单执行Action名
+            逻辑删除
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Name">
+        <member name="P:Blog.Core.Model.Models.BlogArticle.Comments">
             <summary>
-            菜单显示名(如用户页、编辑(按钮)、删除(按钮))
+            评论
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.IsButton">
+        <member name="T:Blog.Core.Model.Models.BlogArticleComment">
             <summary>
-            是否是按钮
+            博客文章 评论
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.IsHide">
+        <member name="T:Blog.Core.Model.Models.Department">
             <summary>
-            是否是隐藏菜单
+             部门表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.IskeepAlive">
+        <member name="P:Blog.Core.Model.Models.Department.CodeRelationship">
             <summary>
-            是否keepAlive
+            Desc:部门关系编码
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Func">
+        <member name="P:Blog.Core.Model.Models.Department.Name">
             <summary>
-            按钮事件
+            Desc:部门名称
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.OrderSort">
+        <member name="P:Blog.Core.Model.Models.Department.Leader">
             <summary>
-            排序
+            Desc:负责人
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Icon">
+        <member name="P:Blog.Core.Model.Models.Department.OrderSort">
             <summary>
-            菜单图标
+            Desc:排序
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.IconNew">
+        <member name="P:Blog.Core.Model.Models.Department.Status">
             <summary>
-            菜单图标新
+            Desc:部门状态(0正常 1停用)
+            Default:0
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Description">
+        <member name="P:Blog.Core.Model.Models.Department.IsDeleted">
             <summary>
-            菜单描述    
+            Desc:删除标志(0代表存在 2代表删除)
+            Default:0
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.Enabled">
+        <member name="P:Blog.Core.Model.Models.Department.CreateBy">
             <summary>
-            激活状态
+            Desc:创建者
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.CreateId">
+        <member name="P:Blog.Core.Model.Models.Department.CreateTime">
             <summary>
-            创建ID
+            Desc:创建时间
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.CreateBy">
+        <member name="P:Blog.Core.Model.Models.Department.ModifyBy">
             <summary>
-            创建者
+            Desc:更新者
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.CreateTime">
+        <member name="P:Blog.Core.Model.Models.Department.ModifyTime">
             <summary>
-            创建时间
+            Desc:更新时间
+            Default:
+            Nullable:True
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.ModifyId">
+        <member name="T:Blog.Core.Model.Models.GblLogAudit">
             <summary>
-            修改ID
+            用户团队表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Id">
             <summary>
-            修改者
+            ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.TraceId">
             <summary>
-            修改时间
+            HttpContext.TraceIdentifier 事件链路ID(获取或设置一个唯一标识符,用于在跟踪日志中表示此请求。)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Permission.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Models.Role">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Date">
             <summary>
-            角色表
+            时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.Role.Name">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Thread">
             <summary>
-            角色名
+            线程
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.Description">
-             <summary>
-            描述
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.Role.OrderSort">
-             <summary>
-            排序
-             </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.Role.Dids">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Level">
             <summary>
-            自定义权限的部门ids
+            等级
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.AuthorityScope">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Logger">
             <summary>
-            权限范围
-            -1 无任何权限;1 自定义权限;2 本部门;3 本部门及以下;4 仅自己;9 全部;
+            记录器
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.Enabled">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.LogType">
             <summary>
-            是否激活
+            日志类型
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.CreateId">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.DataType">
             <summary>
-            创建ID
+            数据类型
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.CreateBy">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Message">
             <summary>
-            创建者
+            错误信息
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.CreateTime">
+        <member name="P:Blog.Core.Model.Models.GblLogAudit.Exception">
             <summary>
-            创建时间
+            异常
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.ModifyId">
-            <summary>
-            修改ID
+        <member name="P:Blog.Core.Model.Models.Guestbook.blogId">
+            <summary>博客ID
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.ModifyBy">
-            <summary>
-            修改者
+        <member name="P:Blog.Core.Model.Models.Guestbook.createdate">
+            <summary>创建时间
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.Role.ModifyTime">
-            <summary>
-            修改时间
+        <member name="P:Blog.Core.Model.Models.Guestbook.phone">
+            <summary>手机
+            
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.RoleModulePermission">
+        <member name="P:Blog.Core.Model.Models.Guestbook.QQ">
+            <summary>qq
+            
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.Guestbook.body">
+            <summary>留言内容
+            
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.Guestbook.ip">
+            <summary>ip地址
+            
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.Guestbook.isshow">
+            <summary>是否显示在前台,0否1是
+            
+            </summary>
+        </member>
+        <member name="T:Blog.Core.Model.Models.Modules">
             <summary>
-            按钮跟权限关联表
+            接口API地址信息表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.IsDeleted">
+        <member name="P:Blog.Core.Model.Models.Modules.IsDeleted">
              <summary>
             获取或设置是否禁用,逻辑上的删除,非物理删除
              </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateId">
+        <member name="P:Blog.Core.Model.Models.Modules.Name">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.Modules.LinkUrl">
+            <summary>
+            菜单链接地址
+            </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.Modules.Area">
             <summary>
-            创建ID
+            区域名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateBy">
+        <member name="P:Blog.Core.Model.Models.Modules.Controller">
             <summary>
-            创建者
+            控制器名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateTime">
+        <member name="P:Blog.Core.Model.Models.Modules.Action">
             <summary>
-            创建时间
+            Action名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyId">
+        <member name="P:Blog.Core.Model.Models.Modules.Icon">
             <summary>
-            修改ID
+            图标
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.Modules.Code">
             <summary>
-            修改者
+            菜单编号
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.Modules.OrderSort">
             <summary>
-            修改时间
+            排序
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.SysTenant">
+        <member name="P:Blog.Core.Model.Models.Modules.Description">
             <summary>
-            系统租户表 <br/>
-            根据TenantType 分为两种方案: <br/>
-            1.按租户字段区分<br/>
-            2.按租户分库<br/>
-            
-            <br/>
-            
-            注意:<br/>
-            使用租户Id方案,无需配置分库的连接
+            /描述
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.Name">
+        <member name="P:Blog.Core.Model.Models.Modules.IsMenu">
             <summary>
-            名称
+            是否是右侧菜单
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.TenantType">
+        <member name="P:Blog.Core.Model.Models.Modules.Enabled">
             <summary>
-            租户类型
+            是否激活
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.ConfigId">
+        <member name="P:Blog.Core.Model.Models.Modules.CreateId">
             <summary>
-            数据库/租户标识 不可重复<br/>
-            使用Id方案,可无需配置
+            创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.Host">
+        <member name="P:Blog.Core.Model.Models.Modules.CreateBy">
             <summary>
-            主机<br/>
-            使用Id方案,可无需配置
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.DbType">
+        <member name="P:Blog.Core.Model.Models.Modules.CreateTime">
             <summary>
-            数据库类型<br/>
-            使用Id方案,可无需配置
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.Connection">
+        <member name="P:Blog.Core.Model.Models.Modules.ModifyId">
             <summary>
-            数据库连接<br/>
-            使用Id方案,可无需配置
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.Status">
+        <member name="P:Blog.Core.Model.Models.Modules.ModifyBy">
             <summary>
-            状态
+            修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysTenant.Remark">
+        <member name="P:Blog.Core.Model.Models.Modules.ModifyTime">
             <summary>
-            备注
+            修改时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.SysUserInfo">
+        <member name="T:Blog.Core.Model.Models.OperateLog">
             <summary>
-            用户信息表
+            日志记录
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.LoginName">
+        <member name="P:Blog.Core.Model.Models.OperateLog.IsDeleted">
+             <summary>
+            获取或设置是否禁用,逻辑上的删除,非物理删除
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.OperateLog.Area">
             <summary>
-            登录账号
+            区域名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.LoginPWD">
+        <member name="P:Blog.Core.Model.Models.OperateLog.Controller">
             <summary>
-            登录密码
+            区域控制器名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.RealName">
+        <member name="P:Blog.Core.Model.Models.OperateLog.Action">
             <summary>
-            真实姓名
+            Action名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.Status">
+        <member name="P:Blog.Core.Model.Models.OperateLog.IPAddress">
             <summary>
-            状态
+            IP地址
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.DepartmentId">
+        <member name="P:Blog.Core.Model.Models.OperateLog.Description">
             <summary>
-            部门
+            描述
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.Remark">
+        <member name="P:Blog.Core.Model.Models.OperateLog.LogTime">
             <summary>
-            备注
+            登录时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.CreateTime">
+        <member name="P:Blog.Core.Model.Models.OperateLog.LoginName">
             <summary>
-            创建时间
+            登录名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.UpdateTime">
+        <member name="P:Blog.Core.Model.Models.OperateLog.UserId">
             <summary>
-            更新时间
+            用户ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.CriticalModifyTime">
+        <member name="T:Blog.Core.Model.Models.PasswordLib">
             <summary>
-            关键业务修改时间
+            密码库表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.LastErrorTime">
+        <member name="P:Blog.Core.Model.Models.PasswordLib.IsDeleted">
              <summary>
-            最后异常时间 
+            获取或设置是否禁用,逻辑上的删除,非物理删除
              </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.ErrorCount">
-             <summary>
-            错误次数 
-             </summary>
+        <member name="T:Blog.Core.Model.Models.Permission">
+            <summary>
+            路由菜单表
+            </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.Name">
+        <member name="P:Blog.Core.Model.Models.Permission.Code">
             <summary>
-            登录账号
+            菜单执行Action名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SysUserInfo.TenantId">
+        <member name="P:Blog.Core.Model.Models.Permission.Name">
             <summary>
-            租户Id
+            菜单显示名(如用户页、编辑(按钮)、删除(按钮))
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.TasksLog">
+        <member name="P:Blog.Core.Model.Models.Permission.IsButton">
             <summary>
-            任务日志表
+            是否是按钮
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.JobId">
+        <member name="P:Blog.Core.Model.Models.Permission.IsHide">
             <summary>
-            任务ID
+            是否是隐藏菜单
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.TotalTime">
+        <member name="P:Blog.Core.Model.Models.Permission.IskeepAlive">
             <summary>
-            任务耗时
+            是否keepAlive
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.RunResult">
+        <member name="P:Blog.Core.Model.Models.Permission.Func">
             <summary>
-            执行结果(0-失败 1-成功)
+            按钮事件
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.RunTime">
+        <member name="P:Blog.Core.Model.Models.Permission.OrderSort">
             <summary>
-            运行时间
+            排序
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.EndTime">
+        <member name="P:Blog.Core.Model.Models.Permission.Icon">
             <summary>
-            结束时间
+            菜单图标
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.RunPars">
+        <member name="P:Blog.Core.Model.Models.Permission.IconNew">
             <summary>
-            执行参数
+            菜单图标新
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.ErrMessage">
+        <member name="P:Blog.Core.Model.Models.Permission.Description">
             <summary>
-            异常信息
+            菜单描述    
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.ErrStackTrace">
+        <member name="P:Blog.Core.Model.Models.Permission.Enabled">
             <summary>
-            异常堆栈
+            激活状态
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.CreateId">
+        <member name="P:Blog.Core.Model.Models.Permission.CreateId">
             <summary>
             创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.CreateBy">
+        <member name="P:Blog.Core.Model.Models.Permission.CreateBy">
             <summary>
             创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.CreateTime">
+        <member name="P:Blog.Core.Model.Models.Permission.CreateTime">
             <summary>
             创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyId">
+        <member name="P:Blog.Core.Model.Models.Permission.ModifyId">
             <summary>
             修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.Permission.ModifyBy">
             <summary>
             修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.Permission.ModifyTime">
             <summary>
             修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.Name">
-            <summary>
-            任务名称
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.TasksLog.JobGroup">
-            <summary>
-            任务分组
-            </summary>
-        </member>
-        <member name="T:Blog.Core.Model.Models.TasksQz">
-            <summary>
-            任务计划表
-            </summary>
-        </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.Name">
-            <summary>
-            任务名称
-            </summary>
+        <member name="P:Blog.Core.Model.Models.Permission.IsDeleted">
+             <summary>
+            获取或设置是否禁用,逻辑上的删除,非物理删除
+             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.JobGroup">
+        <member name="T:Blog.Core.Model.Models.Role">
             <summary>
-            任务分组
+            角色表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.Cron">
-            <summary>
-            任务运行时间表达式
-            </summary>
+        <member name="P:Blog.Core.Model.Models.Role.IsDeleted">
+             <summary>
+            获取或设置是否禁用,逻辑上的删除,非物理删除
+             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.AssemblyName">
+        <member name="P:Blog.Core.Model.Models.Role.Name">
             <summary>
-            任务所在DLL对应的程序集名称
+            角色名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.ClassName">
-            <summary>
-            任务所在类
-            </summary>
+        <member name="P:Blog.Core.Model.Models.Role.Description">
+             <summary>
+            描述
+             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.Remark">
-            <summary>
-            任务描述
-            </summary>
+        <member name="P:Blog.Core.Model.Models.Role.OrderSort">
+             <summary>
+            排序
+             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.RunTimes">
+        <member name="P:Blog.Core.Model.Models.Role.Dids">
             <summary>
-            执行次数
+            自定义权限的部门ids
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.BeginTime">
+        <member name="P:Blog.Core.Model.Models.Role.AuthorityScope">
             <summary>
-            开始时间
+            权限范围
+            -1 无任何权限;1 自定义权限;2 本部门;3 本部门及以下;4 仅自己;9 全部;
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.EndTime">
+        <member name="P:Blog.Core.Model.Models.Role.Enabled">
             <summary>
-            结束时间
+            是否激活
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.TriggerType">
+        <member name="P:Blog.Core.Model.Models.Role.CreateId">
             <summary>
-            触发器类型(0、simple 1、cron)
+            创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.IntervalSecond">
+        <member name="P:Blog.Core.Model.Models.Role.CreateBy">
             <summary>
-            执行间隔时间, 秒为单位
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.CycleRunTimes">
+        <member name="P:Blog.Core.Model.Models.Role.CreateTime">
             <summary>
-            循环执行次数
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.CycleHasRunTimes">
+        <member name="P:Blog.Core.Model.Models.Role.ModifyId">
             <summary>
-            已循环次数
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.IsStart">
+        <member name="P:Blog.Core.Model.Models.Role.ModifyBy">
             <summary>
-            是否启动
+            修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.JobParams">
+        <member name="P:Blog.Core.Model.Models.Role.ModifyTime">
             <summary>
-            执行传参
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.CreateTime">
+        <member name="T:Blog.Core.Model.Models.RoleModulePermission">
             <summary>
-            创建时间
+            按钮跟权限关联表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.TasksQz.Triggers">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.IsDeleted">
+             <summary>
+            获取或设置是否禁用,逻辑上的删除,非物理删除
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateId">
             <summary>
-            任务内存中的状态
+            创建ID
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.BusinessTable">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateBy">
             <summary>
-            业务数据 <br/>
-            多租户 (Id 隔离)
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BusinessTable.TenantId">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.CreateTime">
             <summary>
-            无需手动赋值
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BusinessTable.Name">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyId">
             <summary>
-            名称
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.BusinessTable.Amount">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyBy">
             <summary>
-            金额
+            修改者
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.MultiBusinessSubTable">
+        <member name="P:Blog.Core.Model.Models.RoleModulePermission.ModifyTime">
             <summary>
-            多租户-多表方案 业务表 子表 <br/>
+            修改时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.MultiBusinessTable">
+        <member name="T:Blog.Core.Model.Models.SysTenant">
             <summary>
-            多租户-多表方案 业务表 <br/>
+            系统租户表 <br/>
+            根据TenantType 分为两种方案: <br/>
+            1.按租户字段区分<br/>
+            2.按租户分库<br/>
+            
+            <br/>
+            
+            注意:<br/>
+            使用租户Id方案,无需配置分库的连接
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.MultiBusinessTable.Name">
+        <member name="P:Blog.Core.Model.Models.SysTenant.Name">
             <summary>
             名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.MultiBusinessTable.Amount">
+        <member name="P:Blog.Core.Model.Models.SysTenant.TenantType">
             <summary>
-            金额
+            租户类型
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.MultiBusinessTable.Remark">
+        <member name="P:Blog.Core.Model.Models.SysTenant.ConfigId">
             <summary>
-            备注(测试增加字段,多表迁移)
+            数据库/租户标识 不可重复<br/>
+            使用Id方案,可无需配置
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.SubLibraryBusinessTable">
+        <member name="P:Blog.Core.Model.Models.SysTenant.Host">
             <summary>
-            多租户-多库方案 业务表 <br/>
-            公共库无需标记[MultiTenant]特性
+            主机<br/>
+            使用Id方案,可无需配置
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SubLibraryBusinessTable.Name">
+        <member name="P:Blog.Core.Model.Models.SysTenant.DbType">
             <summary>
-            名称
+            数据库类型<br/>
+            使用Id方案,可无需配置
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SubLibraryBusinessTable.Amount">
+        <member name="P:Blog.Core.Model.Models.SysTenant.Connection">
             <summary>
-            金额
+            数据库连接<br/>
+            使用Id方案,可无需配置
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.SubLibraryBusinessTable.Remark">
+        <member name="P:Blog.Core.Model.Models.SysTenant.Status">
             <summary>
-            备注(测试增加字段,多库迁移)
+            状态
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.Topic">
+        <member name="P:Blog.Core.Model.Models.SysTenant.Remark">
             <summary>
-            Tibug 类别
+            备注
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.TopicDetail">
+        <member name="T:Blog.Core.Model.Models.SysUserInfo">
             <summary>
-            Tibug 博文
+            用户信息表
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.UserRole">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.LoginName">
             <summary>
-            用户跟角色关联表
+            登录账号
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.IsDeleted">
-             <summary>
-            获取或设置是否禁用,逻辑上的删除,非物理删除
-             </summary>
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.LoginPWD">
+            <summary>
+            登录密码
+            </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.CreateId">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.RealName">
             <summary>
-            创建ID
+            真实姓名
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.CreateBy">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.Status">
             <summary>
-            创建者
+            状态
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.CreateTime">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.DepartmentId">
             <summary>
-            创建时间
+            部门
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.ModifyId">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.Remark">
             <summary>
-            修改ID
+            备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.CreateTime">
             <summary>
-            修改者
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.UserRole.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.UpdateTime">
             <summary>
-            修改时间
+            更新时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatCompany">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.CriticalModifyTime">
             <summary>
-            
+            关键业务修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyID">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.LastErrorTime">
+             <summary>
+            最后异常时间 
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.ErrorCount">
+             <summary>
+            错误次数 
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.Name">
             <summary>
-            公司ID
-            </summary> 
+            登录账号
+            </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyName">
+        <member name="P:Blog.Core.Model.Models.SysUserInfo.TenantId">
             <summary>
-            公司名称
+            租户Id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyIP">
+        <member name="T:Blog.Core.Model.Models.TasksLog">
             <summary>
-            公司IP
+            任务日志表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyRemark">
+        <member name="P:Blog.Core.Model.Models.TasksLog.JobId">
             <summary>
-            公司备注
+            任务ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyAPI">
+        <member name="P:Blog.Core.Model.Models.TasksLog.TotalTime">
             <summary>
-            api地址
+            任务耗时
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.Enabled">
+        <member name="P:Blog.Core.Model.Models.TasksLog.RunResult">
             <summary>
-            是否激活
+            执行结果(0-失败 1-成功)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateId">
+        <member name="P:Blog.Core.Model.Models.TasksLog.RunTime">
             <summary>
-            创建者id
+            运行时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateBy">
+        <member name="P:Blog.Core.Model.Models.TasksLog.EndTime">
             <summary>
-            创建人
+            结束时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateTime">
+        <member name="P:Blog.Core.Model.Models.TasksLog.RunPars">
             <summary>
-            创建时间
+            执行参数
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyId">
+        <member name="P:Blog.Core.Model.Models.TasksLog.ErrMessage">
             <summary>
-            修改者id
+            异常信息
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.TasksLog.ErrStackTrace">
             <summary>
-            修改人
+            异常堆栈
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.TasksLog.CreateId">
             <summary>
-            修改时间
+            创建ID
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatConfig">
+        <member name="P:Blog.Core.Model.Models.TasksLog.CreateBy">
             <summary>
-            
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.publicAccount">
+        <member name="P:Blog.Core.Model.Models.TasksLog.CreateTime">
             <summary>
-            微信公众号唯一标识
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.publicNick">
+        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyId">
             <summary>
-            微信公众号名称
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.weChatAccount">
+        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyBy">
             <summary>
-            微信账号
+            修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.weChatNick">
+        <member name="P:Blog.Core.Model.Models.TasksLog.ModifyTime">
             <summary>
-            微信名称
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.appid">
+        <member name="P:Blog.Core.Model.Models.TasksLog.Name">
             <summary>
-            应用ID
+            任务名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.appsecret">
+        <member name="P:Blog.Core.Model.Models.TasksLog.JobGroup">
             <summary>
-            应用秘钥
+            任务分组
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.token">
+        <member name="T:Blog.Core.Model.Models.TasksQz">
             <summary>
-            公众号推送token
+            任务计划表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.interactiveToken">
+        <member name="P:Blog.Core.Model.Models.TasksQz.Name">
             <summary>
-            验证秘钥(验证消息是否真实)
+            任务名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.tokenExpiration">
+        <member name="P:Blog.Core.Model.Models.TasksQz.JobGroup">
             <summary>
-            微信公众号token过期时间
+            任务分组
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.remark">
+        <member name="P:Blog.Core.Model.Models.TasksQz.Cron">
             <summary>
-            备注
+            任务运行时间表达式
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.Enabled">
+        <member name="P:Blog.Core.Model.Models.TasksQz.AssemblyName">
             <summary>
-            是否激活
+            任务所在DLL对应的程序集名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateId">
+        <member name="P:Blog.Core.Model.Models.TasksQz.ClassName">
             <summary>
-            创建者id
+            任务所在类
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateBy">
+        <member name="P:Blog.Core.Model.Models.TasksQz.Remark">
             <summary>
-            创建人
+            任务描述
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateTime">
+        <member name="P:Blog.Core.Model.Models.TasksQz.RunTimes">
             <summary>
-            创建时间
+            执行次数
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyId">
+        <member name="P:Blog.Core.Model.Models.TasksQz.BeginTime">
             <summary>
-            修改者id
+            开始时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.TasksQz.EndTime">
             <summary>
-            修改人
+            结束时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.TasksQz.TriggerType">
             <summary>
-            修改时间
+            触发器类型(0、simple 1、cron)
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatPushLog">
+        <member name="P:Blog.Core.Model.Models.TasksQz.IntervalSecond">
             <summary>
-            
+            执行间隔时间, 秒为单位
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.id">
+        <member name="P:Blog.Core.Model.Models.TasksQz.CycleRunTimes">
             <summary>
-            推送ID
+            循环执行次数
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogFrom">
+        <member name="P:Blog.Core.Model.Models.TasksQz.CycleHasRunTimes">
             <summary>
-            来自谁
+            已循环次数
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogIP">
+        <member name="P:Blog.Core.Model.Models.TasksQz.IsStart">
             <summary>
-            推送IP
+            是否启动
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogCompanyID">
+        <member name="P:Blog.Core.Model.Models.TasksQz.JobParams">
             <summary>
-            推送客户
+            执行传参
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogToUserID">
+        <member name="P:Blog.Core.Model.Models.TasksQz.CreateTime">
             <summary>
-            推送用户
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogTemplateID">
+        <member name="P:Blog.Core.Model.Models.TasksQz.Triggers">
             <summary>
-            推送模板ID
+            任务内存中的状态
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogContent">
+        <member name="T:Blog.Core.Model.Models.Tenant.BusinessTable">
             <summary>
-            推送内容
+            业务数据 <br/>
+            多租户 (Id 隔离)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogTime">
+        <member name="P:Blog.Core.Model.Models.Tenant.BusinessTable.TenantId">
             <summary>
-            推送时间
+            无需手动赋值
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogStatus">
+        <member name="P:Blog.Core.Model.Models.Tenant.BusinessTable.Name">
             <summary>
-            推送状态(Y/N)
+            名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogRemark">
+        <member name="P:Blog.Core.Model.Models.Tenant.BusinessTable.Amount">
             <summary>
-            备注
+            金额
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogOpenid">
+        <member name="T:Blog.Core.Model.Models.Tenant.MultiBusinessSubTable">
             <summary>
-            推送OpenID
+            多租户-多表方案 业务表 子表 <br/>
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogPublicAccount">
+        <member name="T:Blog.Core.Model.Models.Tenant.MultiBusinessTable">
             <summary>
-            推送微信公众号
+            多租户-多表方案 业务表 <br/>
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateId">
+        <member name="P:Blog.Core.Model.Models.Tenant.MultiBusinessTable.Name">
             <summary>
-            创建者id
+            名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateBy">
+        <member name="P:Blog.Core.Model.Models.Tenant.MultiBusinessTable.Amount">
             <summary>
-            创建人
+            金额
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateTime">
+        <member name="P:Blog.Core.Model.Models.Tenant.MultiBusinessTable.Remark">
             <summary>
-            创建时间
+            备注(测试增加字段,多表迁移)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyId">
+        <member name="T:Blog.Core.Model.Models.Tenant.SubLibraryBusinessTable">
             <summary>
-            修改者id
+            多租户-多库方案 业务表 <br/>
+            公共库无需标记[MultiTenant]特性
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.Tenant.SubLibraryBusinessTable.Name">
             <summary>
-            修改人
+            名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.Tenant.SubLibraryBusinessTable.Amount">
             <summary>
-            修改时间
+            金额
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatQR">
+        <member name="P:Blog.Core.Model.Models.Tenant.SubLibraryBusinessTable.Remark">
             <summary>
-            
+            备注(测试增加字段,多库迁移)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRticket">
+        <member name="T:Blog.Core.Model.Models.Topic">
             <summary>
-            主键id,ticket
+            Tibug 类别
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindCompanyID">
+        <member name="T:Blog.Core.Model.Models.TopicDetail">
             <summary>
-            需要绑定的公司
+            Tibug 博文
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindJobID">
+        <member name="T:Blog.Core.Model.Models.UserRole">
             <summary>
-            需要绑定的员工id
+            用户跟角色关联表
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindJobNick">
+        <member name="P:Blog.Core.Model.Models.UserRole.IsDeleted">
+             <summary>
+            获取或设置是否禁用,逻辑上的删除,非物理删除
+             </summary>
+        </member>
+        <member name="P:Blog.Core.Model.Models.UserRole.CreateId">
             <summary>
-            需要绑定的员工昵称
+            创建ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRcrateTime">
+        <member name="P:Blog.Core.Model.Models.UserRole.CreateBy">
             <summary>
-            创建时间
+            创建者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRpublicAccount">
+        <member name="P:Blog.Core.Model.Models.UserRole.CreateTime">
             <summary>
-            关联的公众号
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRisUsed">
+        <member name="P:Blog.Core.Model.Models.UserRole.ModifyId">
             <summary>
-            是否已使用
+            修改ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRuseTime">
+        <member name="P:Blog.Core.Model.Models.UserRole.ModifyBy">
             <summary>
-            使用时间
+            修改者
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.QRuseOpenid">
+        <member name="P:Blog.Core.Model.Models.UserRole.ModifyTime">
             <summary>
-            关联的微信用户id
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateId">
+        <member name="T:Blog.Core.Model.Models.WeChatCompany">
             <summary>
-            创建者id
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateBy">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyID">
             <summary>
-            创建人
-            </summary>
+            公司ID
+            </summary> 
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateTime">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyName">
             <summary>
-            创建时间
+            公司名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyId">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyIP">
             <summary>
-            修改者id
+            公司IP
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyRemark">
             <summary>
-            修改人
+            公司备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CompanyAPI">
             <summary>
-            修改时间
+            api地址
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatSub">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.Enabled">
             <summary>
-            
+            是否激活
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubFromPublicAccount">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateId">
             <summary>
-            来自哪个公众号
+            创建者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.CompanyID">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateBy">
             <summary>
-            绑定公司id
+            创建人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubJobID">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.CreateTime">
             <summary>
-            绑定员工id
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserOpenID">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyId">
             <summary>
-            绑定微信id
+            修改者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserUnionID">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyBy">
             <summary>
-            绑定微信联合id
+            修改人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRegTime">
+        <member name="P:Blog.Core.Model.Models.WeChatCompany.ModifyTime">
             <summary>
-            绑定时间
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRefTime">
+        <member name="T:Blog.Core.Model.Models.WeChatConfig">
             <summary>
-            更新时间
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRemark">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.publicAccount">
             <summary>
-            备注
+            微信公众号唯一标识
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.IsUnBind">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.publicNick">
             <summary>
-            是否已解绑
+            微信公众号名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.LastSubUserOpenID">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.weChatAccount">
             <summary>
-            上次绑定微信id
+            微信账号
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateId">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.weChatNick">
             <summary>
-            创建者id
+            微信名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateBy">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.appid">
             <summary>
-            创建人
+            应用ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateTime">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.appsecret">
             <summary>
-            创建时间
+            应用秘钥
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyId">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.token">
             <summary>
-            修改者id
+            公众号推送token
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.interactiveToken">
             <summary>
-            修改人
+            验证秘钥(验证消息是否真实)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.tokenExpiration">
             <summary>
-            修改时间
+            微信公众号token过期时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Models.WeChatUploadFile">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.remark">
             <summary>
-            
+            备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileID">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.Enabled">
             <summary>
-            文件ID
+            是否激活
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileName">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateId">
             <summary>
-            文件名称
+            创建者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileSize">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateBy">
             <summary>
-            文件大小
+            创建人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileContentType">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.CreateTime">
             <summary>
-            文件类型
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileExtension">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyId">
             <summary>
-            文件拓展名
+            修改者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFilePosition">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyBy">
             <summary>
-            文件位置
+            修改人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileTime">
+        <member name="P:Blog.Core.Model.Models.WeChatConfig.ModifyTime">
             <summary>
-            文件上传时间
+            修改时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileRemark">
+        <member name="T:Blog.Core.Model.Models.WeChatPushLog">
             <summary>
-            文件备注
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.id">
             <summary>
-            创建者id
+            推送ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateBy">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogFrom">
             <summary>
-            创建人
+            来自谁
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateTime">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogIP">
             <summary>
-            创建时间
+            推送IP
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogCompanyID">
             <summary>
-            修改者id
+            推送客户
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogToUserID">
             <summary>
-            修改人
+            推送用户
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogTemplateID">
             <summary>
-            修改时间
+            推送模板ID
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.DepartmentRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogContent">
             <summary>
-            部门表
+            推送内容
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.DepartmentRoot`1.Pid">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogTime">
             <summary>
-            上一级(0表示无上一级)
+            推送时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.ModulesRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogStatus">
             <summary>
-            接口API地址信息表 
-            父类
+            推送状态(Y/N)
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.ModulesRoot`1.ParentId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogRemark">
             <summary>
-            父ID
+            备注
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.PermissionRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogOpenid">
             <summary>
-            路由菜单表
+            推送OpenID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PermissionRoot`1.Pid">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.PushLogPublicAccount">
             <summary>
-            上一级菜单(0表示上一级无菜单)
+            推送微信公众号
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.PermissionRoot`1.Mid">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateId">
             <summary>
-            接口api
+            创建者id
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.RoleModulePermissionRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateBy">
             <summary>
-            按钮跟权限关联表
-            父类
+            创建人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.RoleModulePermissionRoot`1.RoleId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.CreateTime">
             <summary>
-            角色ID
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.RoleModulePermissionRoot`1.ModuleId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyId">
             <summary>
-            菜单ID
+            修改者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.RoleModulePermissionRoot`1.PermissionId">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyBy">
             <summary>
-            api ID
+            修改人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.RootEntityTkey`1.Id">
+        <member name="P:Blog.Core.Model.Models.WeChatPushLog.ModifyTime">
             <summary>
-            ID
-            泛型主键Tkey
+            修改时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.SysUserInfoRoot`1">
+        <member name="T:Blog.Core.Model.Models.WeChatQR">
             <summary>
-            用户信息表
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.SysUserInfoRoot`1.Id">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRticket">
             <summary>
-            Id
-            泛型主键Tkey
+            主键id,ticket
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.TopicDetailRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindCompanyID">
             <summary>
-            Tibug 博文
+            需要绑定的公司
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.UserRoleRoot`1">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindJobID">
             <summary>
-            用户跟角色关联表
-            父类
+            需要绑定的员工id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.UserRoleRoot`1.UserId">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRbindJobNick">
             <summary>
-            用户ID
+            需要绑定的员工昵称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.UserRoleRoot`1.RoleId">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRcrateTime">
             <summary>
-            角色ID
+            创建时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Tenants.ITenantEntity">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRpublicAccount">
             <summary>
-            租户模型接口
+            关联的公众号
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Tenants.ITenantEntity.TenantId">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRisUsed">
             <summary>
-            租户Id
+            是否已使用
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Tenants.MultiTenantAttribute">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRuseTime">
             <summary>
-            标识 多租户 的业务表 <br/>
-            默认设置是多库       <br/>
-            公共表无需区分 直接使用主库 各自业务在各自库中 <br/>
+            使用时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Tenants.TenantTypeEnum">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.QRuseOpenid">
             <summary>
-            租户隔离方案
+            关联的微信用户id
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Id">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateId">
             <summary>
-            Id隔离
+            创建者id
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Db">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateBy">
             <summary>
-            库隔离
+            创建人
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.Tenants.TenantTypeEnum.Tables">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.CreateTime">
             <summary>
-            表隔离
+            创建时间
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.NONE">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyId">
             <summary>
-            无任何权限
+            修改者id
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.Custom">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyBy">
             <summary>
-            自定义权限
+            修改人
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepart">
+        <member name="P:Blog.Core.Model.Models.WeChatQR.ModifyTime">
             <summary>
-            本部门
+            修改时间
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.MyDepartAndDown">
+        <member name="T:Blog.Core.Model.Models.WeChatSub">
             <summary>
-            本部门及以下
+            
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.OnlySelf">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubFromPublicAccount">
             <summary>
-            仅自己
+            来自哪个公众号
             </summary>
         </member>
-        <member name="F:Blog.Core.Model.AuthorityScopeEnum.ALL">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.CompanyID">
             <summary>
-            所有
+            绑定公司id
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationRole">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubJobID">
             <summary>
-            以下model 来自ids4项目,多库模式,为了调取ids4数据
-            角色表
+            绑定员工id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
-             <summary>
-            排序
-             </summary>
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserOpenID">
+            <summary>
+            绑定微信id
+            </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserUnionID">
             <summary>
-            是否激活
+            绑定微信联合id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRegTime">
             <summary>
-            创建ID
+            绑定时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRefTime">
             <summary>
-            创建者
+            更新时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.SubUserRemark">
             <summary>
-            创建时间
+            备注
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.IsUnBind">
             <summary>
-            修改ID
+            是否已解绑
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.LastSubUserOpenID">
             <summary>
-            修改者
+            上次绑定微信id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateId">
             <summary>
-            修改时间
+            创建者id
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.IDS4DbModels.ApplicationUser">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateBy">
             <summary>
-            以下model 来自ids4项目,多库模式,为了调取ids4数据
-            用户表
+            创建人
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.Love">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.CreateTime">
             <summary>
-            这是爱
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Love.Id">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyId">
             <summary>
-            id
+            修改者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Love.Name">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyBy">
             <summary>
-            姓名
+            修改人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.Love.Age">
+        <member name="P:Blog.Core.Model.Models.WeChatSub.ModifyTime">
             <summary>
-            年龄
+            修改时间
             </summary>
         </member>
-        <member name="T:Blog.Core.Model.MessageModel`1">
+        <member name="T:Blog.Core.Model.Models.WeChatUploadFile">
             <summary>
-            通用返回信息类
+            
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.status">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileID">
             <summary>
-            状态码
+            文件ID
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.success">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileName">
             <summary>
-            操作是否成功
+            文件名称
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.msg">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileSize">
             <summary>
-            返回信息
+            文件大小
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.msgDev">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileContentType">
             <summary>
-            开发者信息
+            文件类型
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel`1.response">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileExtension">
             <summary>
-            返回数据集合
+            文件拓展名
             </summary>
         </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String)">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFilePosition">
             <summary>
-            返回成功
+            文件位置
             </summary>
-            <param name="msg">消息</param>
-            <returns></returns>
         </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Success(System.String,`0)">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileTime">
             <summary>
-            返回成功
+            文件上传时间
             </summary>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
         </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String)">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.UploadFileRemark">
             <summary>
-            返回失败
+            文件备注
             </summary>
-            <param name="msg">消息</param>
-            <returns></returns>
         </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Fail(System.String,`0)">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateId">
             <summary>
-            返回失败
+            创建者id
             </summary>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
         </member>
-        <member name="M:Blog.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateBy">
             <summary>
-            返回消息
+            创建人
             </summary>
-            <param name="success">失败/成功</param>
-            <param name="msg">消息</param>
-            <param name="response">数据</param>
-            <returns></returns>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.status">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.CreateTime">
             <summary>
-            状态码
+            创建时间
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.success">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyId">
             <summary>
-            操作是否成功
+            修改者id
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.msg">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyBy">
             <summary>
-            返回信息
+            修改人
             </summary>
         </member>
-        <member name="P:Blog.Core.Model.MessageModel.response">
+        <member name="P:Blog.Core.Model.Models.WeChatUploadFile.ModifyTime">
             <summary>
-            返回数据集合
+            修改时间
             </summary>
         </member>
         <member name="T:Blog.Core.Model.PageModel`1">
diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml
index 5a36963c..522510b9 100644
--- a/Blog.Core.Api/Blog.Core.xml
+++ b/Blog.Core.Api/Blog.Core.xml
@@ -1444,7 +1444,7 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByDbController.Post(Blog.Core.Model.Models.SubLibraryBusinessTable)">
+        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByDbController.Post(Blog.Core.Model.Models.Tenant.SubLibraryBusinessTable)">
             <summary>
             新增数据
             </summary>
@@ -1461,7 +1461,7 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByIdController.Post(Blog.Core.Model.Models.BusinessTable)">
+        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByIdController.Post(Blog.Core.Model.Models.Tenant.BusinessTable)">
             <summary>
             新增业务数据
             </summary>
@@ -1478,7 +1478,7 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByTableController.Post(Blog.Core.Model.Models.MultiBusinessTable)">
+        <member name="M:Blog.Core.Api.Controllers.Tenant.TenantByTableController.Post(Blog.Core.Model.Models.Tenant.MultiBusinessTable)">
             <summary>
             新增数据
             </summary>
diff --git a/Blog.Core.Common/Seed/DBSeed.cs b/Blog.Core.Common/Seed/DBSeed.cs
index 4435914d..4c297e4f 100644
--- a/Blog.Core.Common/Seed/DBSeed.cs
+++ b/Blog.Core.Common/Seed/DBSeed.cs
@@ -93,7 +93,7 @@ public static async Task SeedAsync(MyContext myContext, string webRootPath)
                 var modelTypes = referencedAssemblies
                    .SelectMany(a => a.DefinedTypes)
                    .Select(type => type.AsType())
-                   .Where(x => x.IsClass && x.Namespace is "Blog.Core.Model.Models")
+                   .Where(x => x.IsClass && x.Namespace != null && x.Namespace.StartsWith("Blog.Core.Model.Models"))
                    .Where(s => !s.IsDefined(typeof(MultiTenantAttribute), false))
                    .ToList();
                 await MigrateCore.MigrateAsync(db, modelTypes.ToArray());

From 0960f8eee70ffb53846b1b5f12bff002f13baa7b Mon Sep 17 00:00:00 2001
From: LemonNoCry <ningmengbuku@outlook.com>
Date: Tue, 31 Dec 2024 16:23:57 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=A8=E5=A2=9E=E5=8A=A0=E5=88=86?=
 =?UTF-8?q?=E8=A1=A8=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Controllers/SplitDemoController.cs        | 322 ++++++++++--------
 1 file changed, 182 insertions(+), 140 deletions(-)

diff --git a/Blog.Core.Api/Controllers/SplitDemoController.cs b/Blog.Core.Api/Controllers/SplitDemoController.cs
index f625b202..2f539f49 100644
--- a/Blog.Core.Api/Controllers/SplitDemoController.cs
+++ b/Blog.Core.Api/Controllers/SplitDemoController.cs
@@ -5,91 +5,174 @@
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Linq.Expressions;
+using Blog.Core.Controllers;
+using SqlSugar;
 
-namespace Blog.Core.Api.Controllers
+namespace Blog.Core.Api.Controllers;
+
+/// <summary>
+/// 分表demo
+/// </summary>
+[Route("api/[controller]/[action]")]
+[ApiController]
+[Authorize(Permissions.Name)]
+public class SplitDemoController : BaseApiController
 {
+    readonly ISplitDemoServices splitDemoServices;
+    readonly IUnitOfWorkManage unitOfWorkManage;
+    private readonly ISqlSugarClient _db;
+
+    public SplitDemoController(ISplitDemoServices _splitDemoServices, IUnitOfWorkManage _unitOfWorkManage, ISqlSugarClient db)
+    {
+        splitDemoServices = _splitDemoServices;
+        unitOfWorkManage = _unitOfWorkManage;
+        _db = db;
+    }
+
+    /// <summary>
+    /// 分页获取数据
+    /// </summary>
+    /// <param name="beginTime"></param>
+    /// <param name="endTime"></param>
+    /// <param name="page"></param>
+    /// <param name="key"></param>
+    /// <param name="pageSize"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [AllowAnonymous]
+    public async Task<MessageModel<PageModel<SplitDemo>>> Get(DateTime beginTime, DateTime endTime, int page = 1, string key = "",
+        int pageSize = 10)
+    {
+        if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
+        {
+            key = "";
+        }
+
+        Expression<Func<SplitDemo, bool>> whereExpression = a => (a.Name != null && a.Name.Contains(key));
+        var data = await splitDemoServices.QueryPageSplit(whereExpression, beginTime, endTime, page, pageSize, " Id desc ");
+        return MessageModel<PageModel<SplitDemo>>.Message(data.dataCount >= 0, "获取成功", data);
+    }
+
+    [HttpGet]
+    [AllowAnonymous]
+    public async Task<MessageModel<List<SplitDemo>>> GetSpilt()
+    {
+        var data = await _db.Queryable<SplitDemo>().AS("SplitDemo_20241231").ToListAsync();
+        return Success(data);
+    }
+
     /// <summary>
-    /// 分表demo
+    /// 根据ID获取信息
     /// </summary>
-    [Route("api/[controller]/[action]")]
-    [ApiController]
-    [Authorize(Permissions.Name)]
-    public class SplitDemoController : ControllerBase
+    /// <param name="id"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [AllowAnonymous]
+    public async Task<MessageModel<SplitDemo>> GetById(long id)
     {
-        readonly ISplitDemoServices splitDemoServices;
-        readonly IUnitOfWorkManage unitOfWorkManage;
-        public SplitDemoController(ISplitDemoServices _splitDemoServices, IUnitOfWorkManage _unitOfWorkManage)
+        var data = new MessageModel<string>();
+        var model = await splitDemoServices.QueryByIdSplit(id);
+        if (model != null)
+        {
+            return MessageModel<SplitDemo>.Success("获取成功", model);
+        }
+        else
         {
-            splitDemoServices = _splitDemoServices;
-            unitOfWorkManage = _unitOfWorkManage;
+            return MessageModel<SplitDemo>.Fail("获取失败");
         }
+    }
 
-        /// <summary>
-        /// 分页获取数据
-        /// </summary>
-        /// <param name="beginTime"></param>
-        /// <param name="endTime"></param>
-        /// <param name="page"></param>
-        /// <param name="key"></param>
-        /// <param name="pageSize"></param>
-        /// <returns></returns>
-        [HttpGet]
-        [AllowAnonymous]
-        public async Task<MessageModel<PageModel<SplitDemo>>> Get(DateTime beginTime, DateTime endTime, int page = 1, string key = "", int pageSize = 10)
+    [HttpPost]
+    [AllowAnonymous]
+    public async Task<MessageModel> GenTestData()
+    {
+        //帮我生成一个月数据
+        for (int i = 0; i < 30; i++)
         {
-            if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
+            await splitDemoServices.AddSplit(new SplitDemo()
             {
-                key = "";
-            }
-            Expression<Func<SplitDemo, bool>> whereExpression = a => (a.Name != null && a.Name.Contains(key));
-            var data = await splitDemoServices.QueryPageSplit(whereExpression, beginTime, endTime, page, pageSize, " Id desc ");
-            return MessageModel<PageModel<SplitDemo>>.Message(data.dataCount >= 0, "获取成功", data);
+                Name = "测试数据" + i,
+                CreateTime = DateTime.Now.AddDays(-i)
+            });
         }
 
-        /// <summary>
-        /// 根据ID获取信息
-        /// </summary>
-        /// <param name="id"></param>
-        /// <returns></returns>
-        [HttpGet]
-        [AllowAnonymous]
-        public async Task<MessageModel<SplitDemo>> GetById(long id)
+        return Success();
+    }
+
+    [HttpPost]
+    [AllowAnonymous]
+    public async Task<MessageModel> InitTable()
+    {
+        _db.MappingTables.Add("SplitDemo","SplitDemo_20241231");
+        _db.CodeFirst.InitTables<SplitDemo>();
+        await Task.Delay(1);
+        return Success();
+    }
+
+    /// <summary>
+    /// 添加一条测试数据
+    /// </summary>
+    /// <param name="splitDemo"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [AllowAnonymous]
+    public async Task<MessageModel<string>> Post([FromBody] SplitDemo splitDemo)
+    {
+        var data = new MessageModel<string>();
+        //unitOfWorkManage.BeginTran();
+        var id = (await splitDemoServices.AddSplit(splitDemo));
+        data.success = (id == null ? false : true);
+        try
         {
-            var data = new MessageModel<string>();
-            var model = await splitDemoServices.QueryByIdSplit(id);
-            if (model != null)
+            if (data.success)
             {
-                return MessageModel<SplitDemo>.Success("获取成功", model);
+                data.response = id.FirstOrDefault().ToString();
+                data.msg = "添加成功";
             }
             else
             {
-                return MessageModel<SplitDemo>.Fail("获取失败");
+                data.msg = "添加失败";
             }
         }
+        catch (Exception)
+        {
+            throw;
+        }
+        finally
+        {
+            //if (data.success)
+            //    unitOfWorkManage.CommitTran();
+            //else
+            //    unitOfWorkManage.RollbackTran();
+        }
+
+        return data;
+    }
 
-        /// <summary>
-        /// 添加一条测试数据
-        /// </summary>
-        /// <param name="splitDemo"></param>
-        /// <returns></returns>
-        [HttpPost]
-        [AllowAnonymous]
-        public async Task<MessageModel<string>> Post([FromBody] SplitDemo splitDemo)
+    /// <summary>
+    /// 修改一条测试数据
+    /// </summary>
+    /// <param name="splitDemo"></param>
+    /// <returns></returns>
+    [HttpPut]
+    [AllowAnonymous]
+    public async Task<MessageModel<string>> Put([FromBody] SplitDemo splitDemo)
+    {
+        var data = new MessageModel<string>();
+        if (splitDemo != null && splitDemo.Id > 0)
         {
-            var data = new MessageModel<string>();
-            //unitOfWorkManage.BeginTran();
-            var id = (await splitDemoServices.AddSplit(splitDemo));
-            data.success = (id == null ? false : true);
+            unitOfWorkManage.BeginTran();
+            data.success = await splitDemoServices.UpdateSplit(splitDemo, splitDemo.CreateTime);
             try
             {
                 if (data.success)
                 {
-                    data.response = id.FirstOrDefault().ToString();
-                    data.msg = "添加成功";
+                    data.msg = "修改成功";
+                    data.response = splitDemo?.Id.ObjToString();
                 }
                 else
                 {
-                    data.msg = "添加失败";
+                    data.msg = "修改失败";
                 }
             }
             catch (Exception)
@@ -98,102 +181,61 @@ public async Task<MessageModel<string>> Post([FromBody] SplitDemo splitDemo)
             }
             finally
             {
-                //if (data.success)
-                //    unitOfWorkManage.CommitTran();
-                //else
-                //    unitOfWorkManage.RollbackTran();
+                if (data.success)
+                    unitOfWorkManage.CommitTran();
+                else
+                    unitOfWorkManage.RollbackTran();
             }
-            return data;
         }
 
-        /// <summary>
-        /// 修改一条测试数据
-        /// </summary>
-        /// <param name="splitDemo"></param>
-        /// <returns></returns>
-        [HttpPut]
-        [AllowAnonymous]
-        public async Task<MessageModel<string>> Put([FromBody] SplitDemo splitDemo)
+        return data;
+    }
+
+    /// <summary>
+    /// 根据id删除数据
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    [HttpDelete]
+    [AllowAnonymous]
+    public async Task<MessageModel<string>> Delete(long id)
+    {
+        var data = new MessageModel<string>();
+
+        var model = await splitDemoServices.QueryByIdSplit(id);
+        if (model != null)
         {
-            var data = new MessageModel<string>();
-            if (splitDemo != null && splitDemo.Id > 0)
+            unitOfWorkManage.BeginTran();
+            data.success = await splitDemoServices.DeleteSplit(model, model.CreateTime);
+            try
             {
-                unitOfWorkManage.BeginTran();
-                data.success = await splitDemoServices.UpdateSplit(splitDemo, splitDemo.CreateTime);
-                try
-                {
-                    if (data.success)
-                    {
-                        data.msg = "修改成功";
-                        data.response = splitDemo?.Id.ObjToString();
-                    }
-                    else
-                    {
-                        data.msg = "修改失败";
-                    }
-                }
-                catch (Exception)
+                data.response = id.ObjToString();
+                if (data.success)
                 {
-                    throw;
+                    data.msg = "删除成功";
                 }
-                finally
+                else
                 {
-                    if (data.success)
-                        unitOfWorkManage.CommitTran();
-                    else
-                        unitOfWorkManage.RollbackTran();
+                    data.msg = "删除失败";
                 }
             }
-            return data;
-        }
-
-        /// <summary>
-        /// 根据id删除数据
-        /// </summary>
-        /// <param name="id"></param>
-        /// <returns></returns>
-        [HttpDelete]
-        [AllowAnonymous]
-        public async Task<MessageModel<string>> Delete(long id)
-        {
-            var data = new MessageModel<string>();
-
-            var model = await splitDemoServices.QueryByIdSplit(id);
-            if (model != null)
+            catch (Exception)
             {
-                unitOfWorkManage.BeginTran();
-                data.success = await splitDemoServices.DeleteSplit(model,model.CreateTime);
-                try
-                {
-                    data.response = id.ObjToString();
-                    if (data.success)
-                    {
-                        data.msg = "删除成功";
-                    }
-                    else
-                    {
-                        data.msg = "删除失败";
-                    }
-
-                }
-                catch (Exception)
-                {
-                    throw;
-                }
-                finally
-                {
-                    if (data.success)
-                        unitOfWorkManage.CommitTran();
-                    else
-                        unitOfWorkManage.RollbackTran();
-                }
+                throw;
             }
-            else
+            finally
             {
-                data.msg = "不存在";
+                if (data.success)
+                    unitOfWorkManage.CommitTran();
+                else
+                    unitOfWorkManage.RollbackTran();
             }
-            return data;
-
         }
+        else
+        {
+            data.msg = "不存在";
+        }
+
+        return data;
     }
-}
+}
\ No newline at end of file