Magic.Admin的多库操作

在平时的开发中,受到传统模式的影响,我们都是习惯了单一的数据库表操作,把数据都建到一个库里边,然后进行增删改查,这个是很经典的开发模式。

但是随着项目开发,总会出现这样的应用场景:
1、我们新的系统建立了新库,但是老板让我们把具有相同结构的老数据库也带上(导入到一起或者定时同步,这里不讨论)

2、项目慢慢变大,我们要分库分表了,可能订单数据和用户数据被分开了,但是同一个api业务逻辑里,可能我们需要操作多个DB,比如我正在走的是主库,然后有一个操作,需要把数据从另一个DB里区保存或者查询。

3、想在测试的时候,同时无缝测试多个库连接,比如我的Blog.Core,每次我提交一个版本,都需要对Sqlite、MySql、MSSql(LocalDB)等同时做测试,那我就想在不停掉项目的前提下,做多库测试。

说白了,就是要做多库操作

在Magic.Admin中,多库操作很容易,主要有以下几步:

1. 配置多库连接字串   在Magic.Web.Core/dbsettings.json,写入你的多数据库连接:

 1 {
 2   "ConnectionStrings": {
 3     "DefaultDbNumber": "0",
 4     "DefaultDbType": "Sqlite",
 5     "DefaultDbString": "Data Source=./Magic.db",
 6     "DbConfigs": [
 7       {
 8         "DbNumber": "1",
 9         "DbType": "Sqlite",
10         "DbString": "Data Source=./Magic.db"
11       },
12       {
13         "DbNumber": "2",
14         "DbType": "SqlServer",
15         "DbString": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Kingdee;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
16       },
17       {
18         "DbNumber": "3",
19         "DbType": "MySql",
20         "ConnectionString": "Server=127.0.0.1;Port=3306;User Id=root;Password=123456;Database=bigDataDB;"
21       }
22     ]
23   }
24 }

系统会自动读入数据库配置,配置到SqlClient中。

2. 在你的service中使用注入SqlClient, 并从注入的SqlClient中切换数据库。

 1 using Furion.DynamicApiController;
 2 using Learning.Entity;
 3 using Microsoft.AspNetCore.Authorization;
 4 using SqlSugar;
 5 
 6 namespace Learning.Services
 7 {
 8     /// <summary>
 9     /// Fur学习
10     /// </summary>
11     [AllowAnonymous]
12     public class TestService : IDynamicApiController,ITestService
13     {
14         SqlSugarClient mClient;
15         public TestService(ISqlSugarClient client) 
16         {//构造函数注入方式注入SqlClient. 注意因ISqlSugarClient没有多库切换功能,需要转换成SqlSugarClient
17             mClient = client as SqlSugarClient;
18         }
19         /// <summary>
20         /// 问候Furion
21         /// </summary>
22         /// <returns></returns>
23         public string SayHello()
24         {
25             var erpClient = mClient.GetConnection(2);//切换到数据库2
26             var list = erpClient.Queryable<KbtErpMoInfo>().ToList(); //执行正常的查询
27             if(list.Count > 0)
28             {
29                 return $"切换到数据库2, 获取到了 {list.Count} 条数据";
30             }
31             return "切换失败或者数据库异常";
32         }
33         /// <summary>
34         /// 带参数的问候
35         /// </summary>
36         /// <param name="id">用户ID</param>
37         /// <returns></returns>
38        
39         public string SayHello(int id)
40         {
41             return $"Hello {nameof(Furion)} from User {id}";
42         }
43     }
44 }

效果显示:

 

posted @ 2022-02-24 20:59  CCJungle  阅读(175)  评论(0编辑  收藏  举报