From 7c36c79f37b8eabb542f45f3a93dcd6b7c749b5b Mon Sep 17 00:00:00 2001 From: yubaolee Date: Tue, 24 Jun 2025 23:27:43 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=83docs:=20=E5=A2=9E=E5=8A=A0sqlsugar?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E5=A4=9A=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- newdocs/docs/notes/core/multidbs.md | 151 ++++++++++++++++++++-------- 1 file changed, 111 insertions(+), 40 deletions(-) diff --git a/newdocs/docs/notes/core/multidbs.md b/newdocs/docs/notes/core/multidbs.md index 6af67339..1d627588 100644 --- a/newdocs/docs/notes/core/multidbs.md +++ b/newdocs/docs/notes/core/multidbs.md @@ -23,70 +23,141 @@ permalink: /core/multidbs/ } ``` -## 添加数据上下文 +## SqlSugar操作多数据库 + +### 注入数据库 + +在项目OpenAuth.WebApi的启动代码`Startup.cs`中,把`ConfigureServices`方法中SqlSugar的注入代码修改为如下: + +```csharp + services.AddScoped(s => + { + var connstr2 = "OpenAuthDBContext2"; //这里是第二数据库的连接字符串 + var sqlSugar = new SqlSugarClient + (new List(){ + new ConnectionConfig() + { + DbType = dbType.Value, + ConnectionString = connectionString, + IsAutoCloseConnection = true + }, + new ConnectionConfig() + { + DbType = sqlsugarTypes.FirstOrDefault(it => + dbtypes[connstr2].ToLower().Contains(it.Key)).Value, + ConnectionString = config.GetSection("ConnectionStrings")[connstr2], + IsAutoCloseConnection = true, + ConfigId = connstr2 + } + }); + + //其他代码不变,略... + if(dbType.Value != SqlSugar.DbType.PostgreSQL){ + return sqlSugar; + } + }); + +``` + +### 新建数据库访问基类 + +在项目OpenAuth.App中,新建数据库访问基类,比如`SqlSugarApp2` +```csharp +namespace OpenAuth.App +{ + public abstract class SqlSugarApp2 : SqlSugarBaseApp where T : class, new() + { + public SqlSugarApp2(ISqlSugarClient client, IAuth auth) : base(client, auth) + { + client = client.AsTenant().GetConnection("OpenAuthDBContext2"); + Repository = new SqlSugarRepository(client); //这里用new而不用注入,可以保证client和repository用的是同一个client + SugarClient = client; + _auth = auth; + } + } +} + +``` + +### 编写业务代码 + +我们以系统日志模块为例,只需要调整以下代码,然后运行就可以发现,日志已经全部记录到新的数据库中。 + +```csharp + public class SysLogApp2 : SqlSugarApp2 + { + public void Add(SysLog obj) + { + //程序类型取入口应用的名称,可以根据自己需要调整 + obj.Application = Assembly.GetEntryAssembly().FullName.Split(',')[0]; + Repository.Insert(obj); + } + + public void Update(SysLog obj) + { + Repository.Update(u => new SysLog + { + Content = obj.Content, + CreateTime = obj.CreateTime, + Id = obj.Id, + Ip = obj.Ip, + },u => u.Id == obj.Id); + } + + public SysLogApp2(ISqlSugarClient client, IAuth auth) : base(client, auth) + { + } + } +``` + +## EF操作多数据库 + +### 添加数据上下文 在OpenAuth.Repository中添加新的数据库上下文,比如`OpenAuthDBContext2` ```csharp -public class OpenAuthDBContext2 : DbContext + public partial class OpenAuthDBContext2 : DbContext { - private IConfiguration _configuration; private ILoggerFactory _LoggerFactory; - private const string _connectstr = "OpenAuthDBContext2"; - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseLoggerFactory (_LoggerFactory); + private IConfiguration _configuration; - string connect = _configuration.GetConnectionString(_connectstr); - if (string.IsNullOrEmpty(connect)) - { - throw new Exception($"未能找到{_connectstr}对应的连接字符串信息"); - } + private const string _connectstr = "OpenAuthDBContext2"; //这里是第二数据库的连接字符串 - //这个地方如果用IOption,在单元测试的时候会获取不到AppSetting的值😅 - var dbtypes = _configuration.GetSection("AppSetting:DbTypes").GetChildren() - .ToDictionary(x => x.Key, x => x.Value); - - var dbType = dbtypes[_connectstr]; - if (dbType == Define.DBTYPE_SQLSERVER) - { - optionsBuilder.UseSqlServer(connect); - } - else if(dbType == Define.DBTYPE_MYSQL) //mysql - { - optionsBuilder.UseMySql(connect); - } - else - { - optionsBuilder.UseOracle(connect); - } - - base.OnConfiguring (optionsBuilder); - } - - public OpenAuthDBContext2(DbContextOptions options, - ILoggerFactory loggerFactory,IConfiguration configuration) + public OpenAuthDBContext2(DbContextOptions options, ILoggerFactory loggerFactory, + IConfiguration configuration, + IOptions appConfiguration) : base(options) { _LoggerFactory = loggerFactory; _configuration = configuration; } - ... //其他代码请参考OpenAuthDbContext + //初始化多租户信息,根据租户id调整数据库 + private void InitTenant(DbContextOptionsBuilder optionsBuilder) + { + string connect = _configuration.GetConnectionString(_connectstr); + if (string.IsNullOrEmpty(connect)) + { + throw new Exception($"未能找到租户{_connectstr}对应的连接字符串信息"); + } + + // 其他代码参考OpenAuthDBContext.cs + } + // 其他代码参考OpenAuthDBContext.cs } ``` -## 注入新数据库 +### 注入新数据库 -在项目(OpenAuth.WebApi等)的启动代码`Startup.cs`中,注入刚刚添加的数据库 +在项目OpenAuth.WebApi的启动代码`Startup.cs`中,把`ConfigureServices`方法中注入刚刚添加的数据库上下文 ```csharp services.AddDbContext(); ``` -## 编写业务代码 +### 编写业务代码 我们以系统日志模块为例,只需要调整以下代码,然后运行就可以发现,日志已经全部记录到新的数据库中。