C# Asp Net核心多个连接字符串
我将根据要求尝试添加更多信息: appsettings.jsonC# Asp Net核心多个连接字符串,c#,asp.net-mvc,C#,Asp.net Mvc,我将根据要求尝试添加更多信息: appsettings.json "ConnectionStrings": { "Debug": "server=Server;user id=myuser;password=password;port=3306;database=database1;", "Demo": "server=Server;user id=myuser;password=pass
"ConnectionStrings": {
"Debug": "server=Server;user id=myuser;password=password;port=3306;database=database1;",
"Demo": "server=Server;user id=myuser;password=password;port=3306;database=database2;"
}
两台服务器都相同,但有两个不同的数据库(例如1和2)
Startup.cs:
services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Database1"]));
services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Database2"]));
我有一个调用并连接到数据库的程序,但它只连接到数据库1
客户端控制器
namespace ProjectDatabase.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ClientsController : ControllerBase
{
public ClientsController(AppDb db)
{
Db = db;
}
// GET api/clients
[HttpGet]
public async Task<IActionResult> GetLatest()
{
await Db.Connection.OpenAsync();
var query = new clientsQuery(Db);
var result = await query.LatestClientsAsync();
return new OkObjectResult(result);
}
public AppDb Db { get; }
}
}
namespace ProjectDatabase.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类客户端控制器:ControllerBase
{
公共客户端控制器(AppDb)
{
Db=Db;
}
//获取api/客户端
[HttpGet]
公共异步任务GetLatest()
{
等待Db.Connection.OpenAsync();
var query=new clientsQuery(Db);
var result=await query.LatestClientsAsync();
返回新的OkObjectResult(结果);
}
公共AppDb数据库{get;}
}
}
我对数据库1发出Get请求
问题:我已经连接到Database1,并且希望一次连接一个Database2,如何实现这一点?我如何告诉应用程序从数据库2获取数据?我已经有了第二个连接字符串如何访问它们
为更清晰起见进行了编辑。如果我理解正确,您希望在取决于环境的连接之间切换 因此,您可以查看asp.net配置 创建2个环境文件,然后将连接字符串放入其中 例如: appsettings.Development.json appsettings.Demo.json 您的设置代码如下所示
services.AddTransient(_ => new
Controllers.AppDb(Configuration["ConnectionStrings:MySql"]));
所以在那个些操作之后,你们只需要切换环境,就可以得到正确的连接字符串
了解如何设置多环境配置,您可以在此处:
这是我的AppDb.cs,我的控制器
用于连接,如果我添加第二个MySqlConnection,然后在我的客户端控制器中指定要打开的连接,该怎么办
namespace ProjectDatabase.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ClientsController : ControllerBase
{
public ClientsController(AppDb db)
{
Db = db;
}
// GET api/clients
[HttpGet]
public async Task<IActionResult> GetLatest()
{
await Db.Connection.OpenAsync();
var query = new clientsQuery(Db);
var result = await query.LatestClientsAsync();
return new OkObjectResult(result);
}
public AppDb Db { get; }
}
}
namespace ProjectDatabase.Controllers
{
[路由(“api/[控制器]”)]
[ApiController]
公共类客户端控制器:ControllerBase
{
公共客户端控制器(AppDb)
{
Db=Db;
}
//获取api/客户端
[HttpGet]
公共异步任务GetLatest()
{
等待Db.Connection.OpenAsync();
var query=new clientsQuery(Db);
var result=await query.LatestClientsAsync();
返回新的OkObjectResult(结果);
}
公共AppDb数据库{get;}
}
}
我可以创建另一个Controller
来代替waitDb.Connection.OpenAsync()
,并使用waitDb.Con.OpenAsync()
,这将是我与第二个数据库的第二个连接
这是不会给我带来任何问题或缺点的吗?Startup.cs:
services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Debug"], Configuration["ConnectionStrings:Demo"]));
已解决。为什么您不使用实体框架、dapper或任何ORM?还有,您会遇到什么错误?如果我将注释从该行中删除,我将得到以下错误:InvalidCastException:无法将类型为“System.DBNull”的对象强制转换为类型为“System.String”。应用程序如何知道您需要什么连接?您希望如何更改连接?这正是我想弄明白的,我希望在用户命令上从两个数据库获取数据,例如,用户希望从调试中获取所有客户端,获取它。用户现在希望将数据库更改为第二个名为Demo的数据库,并从该数据库获取所有客户端的列表。我基本上希望连接到这两个数据库,完成请求并准备就绪,以便在Angular中,用户选择Database1或Database2并获取客户端列表。在appsettings.json文件中不可能这样做吗?如何在连接之间切换?例如,我们的想法是准备好两个数据库的连接,从一个数据库获取数据,然后选择第二个数据库从该数据库获取数据。基本上,这两个连接都可以使用,稍后我会询问用户希望连接到哪个数据库。
services.AddTransient(_ => new
Controllers.AppDb(Configuration["ConnectionStrings:MySql"]));
namespace ProjectDatabase.Controllers
{
public class AppDb
{
public MySqlConnection Connection { get; }
public MySqlConnection Con { get; }
public AppDb(string connectionString)
{
Connection = new MySqlConnection(connectionString);
Con = new MySqlConnection(connectionString);
}
public void Dispose() => Connection.Dispose();
}
}
namespace ProjectDatabase.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ClientsController : ControllerBase
{
public ClientsController(AppDb db)
{
Db = db;
}
// GET api/clients
[HttpGet]
public async Task<IActionResult> GetLatest()
{
await Db.Connection.OpenAsync();
var query = new clientsQuery(Db);
var result = await query.LatestClientsAsync();
return new OkObjectResult(result);
}
public AppDb Db { get; }
}
}
services.AddTransient<AppDb>(_ => new Controllers.AppDb(Configuration["ConnectionStrings:Debug"], Configuration["ConnectionStrings:Demo"]));
public class AppDb
{
public MySqlConnection conDebug { get; }
public MySqlConnection conDemo { get; }
public AppDb(string connectionStringDebug, string connectionStringDemo)
{
conDebug = new MySqlConnection(connectionStringDebug);
Hashtable hasDB = new Hashtable();
hasDB["debug"] = conDebug;
}
public void Dispose() => conDebug.Dispose();
}
}