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 }
效果显示: