Selaa lähdekoodia

使用FreeSqlCloud管理多数据库和分布式事务

zhontai 2 vuotta sitten
vanhempi
commit
4da7d788c0
26 muutettua tiedostoa jossa 233 lisäystä ja 169 poistoa
  1. 6 0
      src/hosts/ZhonTai.Host/Configs/dbconfig.json
  2. 6 0
      src/platform/ZhonTai.Admin/Core/Attributes/TransactionAttribute.cs
  3. 10 0
      src/platform/ZhonTai.Admin/Core/Configs/DbConfig.cs
  4. 85 115
      src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs
  5. 8 0
      src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloud.cs
  6. 4 3
      src/platform/ZhonTai.Admin/Core/Db/TransactionAsyncInterceptor.cs
  7. 33 0
      src/platform/ZhonTai.Admin/Core/Db/UnitOfWorkManagerCloud.cs
  8. 16 6
      src/platform/ZhonTai.Admin/Core/HostApp.cs
  9. 16 5
      src/platform/ZhonTai.Admin/Core/Repositories/DefaultRepositoryBase.cs
  10. 2 2
      src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs
  11. 2 2
      src/platform/ZhonTai.Admin/Repositories/Api/ApiRepository.cs
  12. 2 2
      src/platform/ZhonTai.Admin/Repositories/Dictionary/DictionaryRepository.cs
  13. 2 2
      src/platform/ZhonTai.Admin/Repositories/DictionaryType/DictionaryTypeRepository.cs
  14. 2 2
      src/platform/ZhonTai.Admin/Repositories/Document/DocumentRepository.cs
  15. 2 2
      src/platform/ZhonTai.Admin/Repositories/DocumentImage/DocumentImageRepository.cs
  16. 2 2
      src/platform/ZhonTai.Admin/Repositories/Employee/EmployeeRepository.cs
  17. 2 2
      src/platform/ZhonTai.Admin/Repositories/LoginLog/LoginLogRepository.cs
  18. 2 2
      src/platform/ZhonTai.Admin/Repositories/OprationLog/OprationLogRepository.cs
  19. 2 2
      src/platform/ZhonTai.Admin/Repositories/Organization/OrganizationRepository.cs
  20. 2 2
      src/platform/ZhonTai.Admin/Repositories/Permission/PermissionRepository.cs
  21. 2 2
      src/platform/ZhonTai.Admin/Repositories/Role/RoleRepository.cs
  22. 2 2
      src/platform/ZhonTai.Admin/Repositories/Tenant/TenantRepository.cs
  23. 2 2
      src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs
  24. 2 2
      src/platform/ZhonTai.Admin/Repositories/View/ViewRepositoryRepository.cs
  25. 1 1
      src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj
  26. 18 9
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

+ 6 - 0
src/hosts/ZhonTai.Host/Configs/dbconfig.json

@@ -50,5 +50,11 @@
     //  "type": "MySql",
     //  "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;"
     //}
+  ],
+
+  //分布式事务唯一标识
+  "distributeKey": "admin",
+  //读写分离从库列表
+  "slaveList": [
   ]
 }

+ 6 - 0
src/platform/ZhonTai.Admin/Core/Attributes/TransactionAttribute.cs

@@ -19,4 +19,10 @@ public class TransactionAttribute : Attribute
     /// 事务隔离级别
     /// </summary>
     public IsolationLevel IsolationLevel { get; set; }
+
+    /// <summary>
+    /// 数据库名称
+    /// </summary>
+    public string DbName { get; set; }
+
 }

+ 10 - 0
src/platform/ZhonTai.Admin/Core/Configs/DbConfig.cs

@@ -87,4 +87,14 @@ public class DbConfig
     /// 多数据库
     /// </summary>
     public MultiDb[] Dbs { get; set; }
+
+    /// <summary>
+    /// 分布式事务唯一标识
+    /// </summary>
+    public string DistributeKey { get; set; }
+
+    /// <summary>
+    /// 读写分离从库列表
+    /// </summary>
+    public string[] SlaveList { get; set; }
 }

+ 85 - 115
src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs

@@ -17,155 +17,125 @@ namespace ZhonTai.Admin.Core.Db;
 public static class DBServiceCollectionExtensions
 {
     /// <summary>
-    /// 添加数据库
+    /// 添加数据库
     /// </summary>
     /// <param name="services"></param>
+    /// <param name="freeSqlCloud"></param>
     /// <param name="env"></param>
     /// <param name="hostAppOptions"></param>
     /// <returns></returns>
-    public async static Task AddDbAsync(this IServiceCollection services, IHostEnvironment env, HostAppOptions hostAppOptions)
+    public static void AddMasterDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
     {
-        services.AddScoped<DbUnitOfWorkManager>();
-
-        var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
-
-        //创建数据库
-        if (dbConfig.CreateDb)
+        freeSqlCloud.Register("master", () =>
         {
-            await DbHelper.CreateDatabaseAsync(dbConfig);
-        }
+            var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
 
-        #region FreeSql
+            //创建数据库
+            if (dbConfig.CreateDb)
+            {
+                DbHelper.CreateDatabaseAsync(dbConfig).Wait();
+            }
 
-        var freeSqlBuilder = new FreeSqlBuilder()
-                .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
-                .UseAutoSyncStructure(false)
-                .UseLazyLoading(false)
-                .UseNoneCommandParameter(true);
+            #region FreeSql
 
-        hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
+            var freeSqlBuilder = new FreeSqlBuilder()
+                    .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
+                    .UseAutoSyncStructure(false)
+                    .UseLazyLoading(false)
+                    .UseNoneCommandParameter(true);
 
-        #region 监听所有命令
+            hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
 
-        if (dbConfig.MonitorCommand)
-        {
-            freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
+            #region 监听所有命令
+
+            if (dbConfig.MonitorCommand)
             {
-                //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
-                Console.WriteLine($"{cmd.CommandText}\r\n");
-            });
-        }
+                freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
+                {
+                    //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
+                    Console.WriteLine($"{cmd.CommandText}\r\n");
+                });
+            }
 
-        #endregion 监听所有命令
+            #endregion 监听所有命令
 
-        var fsql = freeSqlBuilder.Build();
-        fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
+            var fsql = freeSqlBuilder.Build();
+            fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
 
-        //配置实体
-        var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
-        DbHelper.ConfigEntity(fsql, appConfig);
+            //配置实体
+            var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
+            DbHelper.ConfigEntity(fsql, appConfig);
 
-        hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
-        #region 初始化数据库
+            hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
+            #region 初始化数据库
 
-        //同步结构
-        if (dbConfig.SyncStructure)
-        {
-            DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
-        }
+            //同步结构
+            if (dbConfig.SyncStructure)
+            {
+                DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
+            }
 
-        var user = services.BuildServiceProvider().GetService<IUser>();
+            var user = services.BuildServiceProvider().GetService<IUser>();
 
-        #region 审计数据
+            #region 审计数据
 
-        //计算服务器时间
-        var selectProvider = fsql.Select<object>() as Select0Provider;
-        var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
-        var timeOffset = DateTime.UtcNow.Subtract(serverTime);
-        DbHelper.TimeOffset = timeOffset;
-        fsql.Aop.AuditValue += (s, e) =>
-        {
-            DbHelper.AuditValue(e, timeOffset, user);
-        };
+            //计算服务器时间
+            var selectProvider = fsql.Select<object>() as Select0Provider;
+            var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
+            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
+            DbHelper.TimeOffset = timeOffset;
+            fsql.Aop.AuditValue += (s, e) =>
+            {
+                DbHelper.AuditValue(e, timeOffset, user);
+            };
 
-        #endregion 审计数据
+            #endregion 审计数据
 
-        //同步数据
-        if (dbConfig.SyncData)
-        {
-            await DbHelper.SyncDataAsync(fsql, dbConfig, appConfig);
-        }
+            //同步数据
+            if (dbConfig.SyncData)
+            {
+                DbHelper.SyncDataAsync(fsql, dbConfig, appConfig).Wait();
+            }
 
-        #endregion 初始化数据库
+            #endregion 初始化数据库
 
-        //生成数据
-        if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
-        {
-            await DbHelper.GenerateDataAsync(fsql, appConfig);
-        }
+            //生成数据
+            if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
+            {
+                DbHelper.GenerateDataAsync(fsql, appConfig).Wait();
+            }
 
-        #region 监听Curd操作
+            #region 监听Curd操作
 
-        if (dbConfig.Curd)
-        {
-            fsql.Aop.CurdBefore += (s, e) =>
+            if (dbConfig.Curd)
             {
-                if (appConfig.MiniProfiler)
+                fsql.Aop.CurdBefore += (s, e) =>
                 {
-                    MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
-                }
-                Console.WriteLine($"{e.Sql}\r\n");
-            };
-            fsql.Aop.CurdAfter += (s, e) =>
-            {
-                if (appConfig.MiniProfiler)
+                    if (appConfig.MiniProfiler)
+                    {
+                        MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
+                    }
+                    Console.WriteLine($"{e.Sql}\r\n");
+                };
+                fsql.Aop.CurdAfter += (s, e) =>
                 {
-                    MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
-                }
-            };
-        }
-
-        #endregion 监听Curd操作
-
-        if (appConfig.Tenant)
-        {
-            fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
-        }
-
-        #endregion FreeSql
+                    if (appConfig.MiniProfiler)
+                    {
+                        MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
+                    }
+                };
+            }
 
-        services.AddSingleton(fsql);
+            #endregion 监听Curd操作
 
-        //导入多数据库
-        if (null != dbConfig.Dbs)
-        {
-            foreach (var multiDb in dbConfig.Dbs)
+            if (appConfig.Tenant)
             {
-                switch (multiDb.Name)
-                {
-                    case nameof(MySqlDb):
-                        var mdb = CreateMultiDbBuilder(multiDb).Build<MySqlDb>();
-                        services.AddSingleton(mdb);
-                        break;
-
-                    default:
-                        break;
-                }
+                fsql.GlobalFilter.Apply<ITenant>("Tenant", a => a.TenantId == user.TenantId);
             }
-        }
-    }
 
-    /// <summary>
-    /// 创建多数据库构建器
-    /// </summary>
-    /// <param name="multiDb"></param>
-    /// <returns></returns>
-    private static FreeSqlBuilder CreateMultiDbBuilder(MultiDb multiDb)
-    {
-        return new FreeSqlBuilder()
-        .UseConnectionString(multiDb.Type, multiDb.ConnectionString)
-        .UseAutoSyncStructure(false)
-        .UseLazyLoading(false)
-        .UseNoneCommandParameter(true);
+            #endregion FreeSql
+
+            return fsql;
+        });
     }
 }

+ 8 - 0
src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloud.cs

@@ -0,0 +1,8 @@
+
+namespace FreeSql;
+
+public class FreeSqlCloud : FreeSqlCloud<string>
+{
+    public FreeSqlCloud() : base(null) { }
+    public FreeSqlCloud(string distributeKey) : base(distributeKey) { }
+}

+ 4 - 3
src/platform/ZhonTai.Admin/Core/Db/TransactionAsyncInterceptor.cs

@@ -11,9 +11,9 @@ namespace ZhonTai.Admin.Core.Db;
 public class TransactionAsyncInterceptor : IAsyncInterceptor
 {
     private IUnitOfWork _unitOfWork;
-    private readonly DbUnitOfWorkManager _unitOfWorkManager;
+    private readonly UnitOfWorkManagerCloud _unitOfWorkManager;
 
-    public TransactionAsyncInterceptor(DbUnitOfWorkManager unitOfWorkManager)
+    public TransactionAsyncInterceptor(UnitOfWorkManagerCloud unitOfWorkManager)
     {
         _unitOfWorkManager = unitOfWorkManager;
     }
@@ -25,7 +25,8 @@ public class TransactionAsyncInterceptor : IAsyncInterceptor
         if (attribute is TransactionAttribute transaction)
         {
             IsolationLevel? isolationLevel = transaction.IsolationLevel == 0 ? null : transaction.IsolationLevel;
-            _unitOfWork = _unitOfWorkManager.Begin(transaction.Propagation, isolationLevel);
+
+            _unitOfWork = _unitOfWorkManager.Begin(transaction.DbName, transaction.Propagation, isolationLevel);
             return true;
         }
 

+ 33 - 0
src/platform/ZhonTai.Admin/Core/Db/UnitOfWorkManagerCloud.cs

@@ -0,0 +1,33 @@
+using FreeSql;
+using System.Collections.Generic;
+using System.Data;
+
+namespace ZhonTai.Admin.Core.Db;
+
+public class UnitOfWorkManagerCloud
+{
+    readonly Dictionary<string, UnitOfWorkManager> m_managers = new Dictionary<string, UnitOfWorkManager>();
+    readonly FreeSqlCloud m_cloud;
+    public UnitOfWorkManagerCloud(FreeSqlCloud cloud)
+    {
+        m_cloud = cloud;
+    }
+
+    public UnitOfWorkManager GetUnitOfWorkManager(string db)
+    {
+        if (m_managers.TryGetValue(db, out var uowm) == false)
+            m_managers.Add(db, uowm = new UnitOfWorkManager(m_cloud.Use(db)));
+        return uowm;
+    }
+
+    public void Dispose()
+    {
+        foreach (var uowm in m_managers.Values) uowm.Dispose();
+        m_managers.Clear();
+    }
+
+    public IUnitOfWork Begin(string db, Propagation propagation = Propagation.Required, IsolationLevel? isolationLevel = null)
+    {
+        return GetUnitOfWorkManager(db).Begin(propagation, isolationLevel);
+    }
+}

+ 16 - 6
src/platform/ZhonTai.Admin/Core/HostApp.cs

@@ -46,6 +46,7 @@ using Autofac.Extensions.DependencyInjection;
 using Microsoft.AspNetCore.Mvc;
 using ZhonTai.Admin.Core.Startup;
 using ZhonTai.Admin.Core.Conventions;
+using FreeSql;
 
 namespace ZhonTai.Admin.Core;
 
@@ -167,17 +168,26 @@ public class HostApp
         services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
         services.TryAddSingleton<IUser, User>();
 
-        //添加数据库
-        services.AddDbAsync(env, _hostAppOptions).Wait();
-
         //数据库配置
         var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
         services.AddSingleton(dbConfig);
 
+        //添加FreeSqlCloud单例
+        var freeSqlCloud = new FreeSqlCloud(dbConfig.DistributeKey);
+        services.AddSingleton<IFreeSql>(freeSqlCloud);
+        services.AddSingleton(freeSqlCloud);
+
+        //添加数据库
+        services.AddScoped<UnitOfWorkManagerCloud>();
+        services.AddScoped<DbUnitOfWorkManager>();
+        services.AddMasterDb(freeSqlCloud, env, _hostAppOptions);
+
         //添加IdleBus单例
-        var timeSpan = dbConfig.IdleTime > 0 ? TimeSpan.FromMinutes(dbConfig.IdleTime) : TimeSpan.MaxValue;
-        var ib = new IdleBus<IFreeSql>(timeSpan);
-        services.AddSingleton(ib);
+        //var timeSpan = dbConfig.IdleTime > 0 ? TimeSpan.FromMinutes(dbConfig.IdleTime) : TimeSpan.MaxValue;
+        //var ib = new IdleBus<IFreeSql>(timeSpan);
+        //services.AddSingleton(ib);
+
+
 
         //上传配置
         var uploadConfig = ConfigHelper.Load("uploadconfig", env.EnvironmentName, true);

+ 16 - 5
src/platform/ZhonTai.Admin/Core/Repositories/DefaultRepositoryBase.cs

@@ -1,15 +1,26 @@
-using System;
+using FreeSql;
+using System;
 using System.Linq.Expressions;
 using ZhonTai.Admin.Core.Db;
 
 namespace ZhonTai.Admin.Core.Repositories;
 
-public class DefaultRepositoryBase<TEntity, TKey> : RepositoryBase<TEntity, TKey> where TEntity : class, new()
+public class DefaultRepositoryBase<TEntity, TKey> : RepositoryBase<TEntity, TKey> where TEntity : class
 {
-    public DefaultRepositoryBase(IFreeSql fsql) : base(fsql) { }
+    public DefaultRepositoryBase(IFreeSql fsql) : base(fsql, null, null) { }
     public DefaultRepositoryBase(IFreeSql fsql, Expression<Func<TEntity, bool>> filter) : base(fsql, filter, null) { }
-    public DefaultRepositoryBase(IFreeSql fsql, DbUnitOfWorkManager muowManger) : base(muowManger?.Orm ?? fsql, null, null)
+    public DefaultRepositoryBase(IFreeSql fsql, UnitOfWorkManager uowManger) : base(uowManger?.Orm ?? fsql, null, null)
     {
-        muowManger?.Binding(this);
+        uowManger?.Binding(this);
     }
 }
+
+public class RepositoryCloud<T> : DefaultRepositoryBase<T, long> where T : class
+{
+    public RepositoryCloud(UnitOfWorkManagerCloud uomw) : this("master", uomw) { }
+    public RepositoryCloud(string db, UnitOfWorkManagerCloud uomw) : this(uomw.GetUnitOfWorkManager(db)) { }
+    RepositoryCloud(UnitOfWorkManager uomw) : base(uomw.Orm, uomw)
+    {
+        uomw.Binding(this);
+    }
+}

+ 2 - 2
src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs

@@ -7,7 +7,7 @@ using ZhonTai.Admin.Core.Db;
 
 namespace ZhonTai.Admin.Core.Repositories
 {
-    public class RepositoryBase<TEntity, TKey> : BaseRepository<TEntity, TKey>, IRepositoryBase<TEntity, TKey> where TEntity : class, new()
+    public class RepositoryBase<TEntity, TKey> : BaseRepository<TEntity, TKey>, IRepositoryBase<TEntity, TKey> where TEntity : class
     {
         public IUser User { get; set; }
 
@@ -108,7 +108,7 @@ namespace ZhonTai.Admin.Core.Repositories
         }
     }
 
-    public class RepositoryBase<TEntity> : RepositoryBase<TEntity, long>, IRepositoryBase<TEntity> where TEntity : class, new()
+    public class RepositoryBase<TEntity> : RepositoryBase<TEntity, long>, IRepositoryBase<TEntity> where TEntity : class
     {
         public RepositoryBase(DbUnitOfWorkManager uowm) : base(uowm.Orm)
         {

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Api/ApiRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Api;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class ApiRepository : RepositoryBase<ApiEntity>, IApiRepository
+public class ApiRepository : RepositoryCloud<ApiEntity>, IApiRepository
 {
-    public ApiRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public ApiRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Dictionary/DictionaryRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Dictionary;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class DictionaryRepository : RepositoryBase<DictionaryEntity>, IDictionaryRepository
+public class DictionaryRepository : RepositoryCloud<DictionaryEntity>, IDictionaryRepository
 {
-    public DictionaryRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public DictionaryRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/DictionaryType/DictionaryTypeRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.DictionaryType;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class DictionaryTypeRepository : RepositoryBase<DictionaryTypeEntity>, IDictionaryTypeRepository
+public class DictionaryTypeRepository : RepositoryCloud<DictionaryTypeEntity>, IDictionaryTypeRepository
 {
-    public DictionaryTypeRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public DictionaryTypeRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Document/DocumentRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Document;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class DocumentRepository : RepositoryBase<DocumentEntity>, IDocumentRepository
+public class DocumentRepository : RepositoryCloud<DocumentEntity>, IDocumentRepository
 {
-    public DocumentRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public DocumentRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/DocumentImage/DocumentImageRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.DocumentImage;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class DocumentImageRepository : RepositoryBase<DocumentImageEntity>, IDocumentImageRepository
+public class DocumentImageRepository : RepositoryCloud<DocumentImageEntity>, IDocumentImageRepository
 {
-    public DocumentImageRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public DocumentImageRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Employee/EmployeeRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Employee;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class EmployeeRepository : RepositoryBase<EmployeeEntity>, IEmployeeRepository
+public class EmployeeRepository : RepositoryCloud<EmployeeEntity>, IEmployeeRepository
 {
-    public EmployeeRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public EmployeeRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
 
     }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/LoginLog/LoginLogRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.LoginLog;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class LoginLogRepository : RepositoryBase<LoginLogEntity>, ILoginLogRepository
+public class LoginLogRepository : RepositoryCloud<LoginLogEntity>, ILoginLogRepository
 {
-    public LoginLogRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public LoginLogRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/OprationLog/OprationLogRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.OprationLog;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class OprationLogRepository : RepositoryBase<OprationLogEntity>, IOprationLogRepository
+public class OprationLogRepository : RepositoryCloud<OprationLogEntity>, IOprationLogRepository
 {
-    public OprationLogRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public OprationLogRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Organization/OrganizationRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Organization;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class OrganizationRepository : RepositoryBase<OrganizationEntity>, IOrganizationRepository
+public class OrganizationRepository : RepositoryCloud<OrganizationEntity>, IOrganizationRepository
 {
-    public OrganizationRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public OrganizationRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Permission/PermissionRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Permission;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class PermissionRepository : RepositoryBase<PermissionEntity>, IPermissionRepository
+public class PermissionRepository : RepositoryCloud<PermissionEntity>, IPermissionRepository
 {
-    public PermissionRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public PermissionRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Role/RoleRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Role;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class RoleRepository : RepositoryBase<RoleEntity>, IRoleRepository
+public class RoleRepository : RepositoryCloud<RoleEntity>, IRoleRepository
 {
-    public RoleRepository(DbUnitOfWorkManager uowm) : base(uowm)
+    public RoleRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/Tenant/TenantRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.Tenant;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class TenantRepository : RepositoryBase<TenantEntity>, ITenantRepository
+public class TenantRepository : RepositoryCloud<TenantEntity>, ITenantRepository
 {
-    public TenantRepository(DbUnitOfWorkManager muowm) : base(muowm)
+    public TenantRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class UserRepository : RepositoryBase<UserEntity>, IUserRepository
+public class UserRepository : RepositoryCloud<UserEntity>, IUserRepository
 {
-    public UserRepository(DbUnitOfWorkManager muowm) : base(muowm)
+    public UserRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
     {
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Repositories/View/ViewRepositoryRepository.cs

@@ -4,9 +4,9 @@ using ZhonTai.Admin.Domain.View;
 
 namespace ZhonTai.Admin.Repositories;
 
-public class ViewRepository : RepositoryBase<ViewEntity>, IViewRepository
+public class ViewRepository : RepositoryCloud<ViewEntity>, IViewRepository
 {
-    public ViewRepository(DbUnitOfWorkManager muowm) : base(muowm)
+    public ViewRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
     {
     }
 }

+ 1 - 1
src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj

@@ -17,8 +17,8 @@
 		<PackageReference Include="Caching.CSRedis" Version="3.8.669" />
 		<PackageReference Include="FluentValidation.AspNetCore" Version="11.2.2" />
 		<PackageReference Include="FreeSql" Version="3.2.669" />
+		<PackageReference Include="FreeSql.Cloud" Version="1.6.3" />
 		<PackageReference Include="FreeSql.Repository" Version="3.2.669" />
-		<PackageReference Include="IdleBus" Version="1.5.2" />
 		<PackageReference Include="FreeScheduler" Version="1.0.9" />
 		<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
 		<PackageReference Include="Mapster" Version="7.3.0" />

+ 18 - 9
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -34,6 +34,11 @@
             事务隔离级别
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Attributes.TransactionAttribute.DbName">
+            <summary>
+            数据库名称
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Attributes.ValidateInputAttribute">
             <summary>
             输入模型验证
@@ -475,6 +480,16 @@
             多数据库
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.DistributeKey">
+            <summary>
+            分布式事务唯一标识
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.SlaveList">
+            <summary>
+            读写分离从库列表
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.JwtConfig">
             <summary>
             Jwt配置
@@ -683,22 +698,16 @@
             <returns></returns>
             <exception cref="T:System.Exception"></exception>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.AddDbAsync(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,ZhonTai.Admin.Core.Startup.HostAppOptions)">
+        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.AddMasterDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,FreeSql.FreeSqlCloud,Microsoft.Extensions.Hosting.IHostEnvironment,ZhonTai.Admin.Core.Startup.HostAppOptions)">
             <summary>
-            添加数据库
+            添加数据库
             </summary>
             <param name="services"></param>
+            <param name="freeSqlCloud"></param>
             <param name="env"></param>
             <param name="hostAppOptions"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Core.Db.DBServiceCollectionExtensions.CreateMultiDbBuilder(ZhonTai.Admin.Core.Configs.MultiDb)">
-            <summary>
-            创建多数据库构建器
-            </summary>
-            <param name="multiDb"></param>
-            <returns></returns>
-        </member>
         <member name="M:ZhonTai.Admin.Core.Db.IdleBusExtesions.CreateFreeSql(ZhonTai.Admin.Core.Auth.IUser,ZhonTai.Admin.Core.Configs.AppConfig,ZhonTai.Admin.Core.Configs.DbConfig,ZhonTai.Admin.Core.Dto.CreateFreeSqlTenantDto)">
             <summary>
             创建FreeSql实例