mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-15 22:58:11 +08:00
📃docs: 增加sqlsugar访问多数据库
This commit is contained in:
parent
a8681f962c
commit
7c36c79f37
@ -23,70 +23,141 @@ permalink: /core/multidbs/
|
||||
}
|
||||
```
|
||||
|
||||
## 添加数据上下文
|
||||
## SqlSugar操作多数据库
|
||||
|
||||
### 注入数据库
|
||||
|
||||
在项目OpenAuth.WebApi的启动代码`Startup.cs`中,把`ConfigureServices`方法中SqlSugar的注入代码修改为如下:
|
||||
|
||||
```csharp
|
||||
services.AddScoped<ISqlSugarClient>(s =>
|
||||
{
|
||||
var connstr2 = "OpenAuthDBContext2"; //这里是第二数据库的连接字符串
|
||||
var sqlSugar = new SqlSugarClient
|
||||
(new List<ConnectionConfig>(){
|
||||
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<T> : SqlSugarBaseApp<T> where T : class, new()
|
||||
{
|
||||
public SqlSugarApp2(ISqlSugarClient client, IAuth auth) : base(client, auth)
|
||||
{
|
||||
client = client.AsTenant().GetConnection("OpenAuthDBContext2");
|
||||
Repository = new SqlSugarRepository<T>(client); //这里用new而不用注入,可以保证client和repository用的是同一个client
|
||||
SugarClient = client;
|
||||
_auth = auth;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### 编写业务代码
|
||||
|
||||
我们以系统日志模块为例,只需要调整以下代码,然后运行就可以发现,日志已经全部记录到新的数据库中。
|
||||
|
||||
```csharp
|
||||
public class SysLogApp2 : SqlSugarApp2<SysLog>
|
||||
{
|
||||
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<OpenAuthDBContext2> options,
|
||||
ILoggerFactory loggerFactory,IConfiguration configuration)
|
||||
public OpenAuthDBContext2(DbContextOptions<OpenAuthDBContext2> options, ILoggerFactory loggerFactory,
|
||||
IConfiguration configuration,
|
||||
IOptions<AppSetting> 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<OpenAuthDBContext2>();
|
||||
```
|
||||
|
||||
## 编写业务代码
|
||||
### 编写业务代码
|
||||
|
||||
我们以系统日志模块为例,只需要调整以下代码,然后运行就可以发现,日志已经全部记录到新的数据库中。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user