Entity framework core 是否可以使用一个数据库动态定义另一个数据库的连接字符串?

Entity framework core 是否可以使用一个数据库动态定义另一个数据库的连接字符串?,entity-framework-core,dbcontext,asp.net-core-2.0,Entity Framework Core,Dbcontext,Asp.net Core 2.0,我目前的项目有点困难 我有三个标准化的数据库,其中一个我想动态连接;这些是: 帐户:用于安全的帐户信息,跨客户端 配置:用于管理我们的客户 客户:这将是我们每个客户的原子&保存他们的所有信息 我需要使用存储在“配置”数据库中的数据来修改将用于连接到“客户机”数据库的ConnectionString,但这是我遇到的问题 到目前为止,通过连接EntityFrameWorkCore工具并使用“Scaffold DbContext”命令,我已经将数据库中的实体生成到一个项目中&可以进行简单的查找以确

我目前的项目有点困难

我有三个标准化的数据库,其中一个我想动态连接;这些是:

  • 帐户:用于安全的帐户信息,跨客户端
  • 配置:用于管理我们的客户
  • 客户:这将是我们每个客户的原子&保存他们的所有信息
我需要使用存储在“配置”数据库中的数据来修改将用于连接到“客户机”数据库的ConnectionString,但这是我遇到的问题

到目前为止,通过连接EntityFrameWorkCore工具并使用“Scaffold DbContext”命令,我已经将数据库中的实体生成到一个项目中&可以进行简单的查找以确保数据库连接到OK

现在,我试图通过将数据库添加到ServiceCollection来注册数据库,我已将它们添加到StartUp类中,如下所示:

//此方法由运行时调用。使用此方法向容器中添加服务。
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
配置(选项=>
{
options.Filters.Add(新的requireHttpAttribute());
});
services.AddDbContext是一种可能的途径,但我必须承认,我在开始使用ASP.NETCore时有点迷茫

是否可以在ConfigureServices方法中连接到新添加的DbContext?或者我可以/必须在以后将此数据库添加到服务集合中

谢谢

编辑1:

我刚刚找到了一篇博文,其中提到DbContext不能在OnConfigurang中使用,因为它仍在配置中;这很有意义。我现在想知道是否可以将这三个DbContext都推到一个自定义中间件中,以封装、配置并使连接可用;这是一项新的研究

编辑2:
我还发现了另一篇文章,描述了如何使用它,这看起来是一个很有希望的起点;然而,根据“DbContextFactory”的说法,这是针对旧版本的ASP.NETCore的已重命名,因此我现在正在努力将给出的示例更新为一个可能的解决方案。

因此,我最终解决了所有问题。我放弃了工厂的想法,因为我不太适应花时间解决它&我正赶在最后期限前,所以更快的选项现在是更好的选项,我总能找到时间重新设计tor稍后再看代码(lol)

我的
appsettings.json
文件当前仅包含以下内容(appsettings.Developments.json
的相关位相同):

{
“连接字符串”:{
“帐户”:“服务器=测试服务器;数据库=帐户;可信连接=True;”,
“客户机”:“服务器=测试服务器;数据库={Client\u DB};受信任的\u连接=True;”,
“配置”:“服务器=testserver;数据库=Configuration;可信连接=True;”
},
“日志记录”:{
“包含范围”:错误,
“调试”:{
“日志级别”:{
“默认值”:“警告”
}
},
“控制台”:{
“日志级别”:{
“默认值”:“警告”
}
}
}
}
我选择在启动的ConfigureServices方法中配置两个静态数据库,当应用程序开始做任何事情时,它们应该已经配置好并准备好使用。那里的代码很好&干净

public void配置服务(IServiceCollection服务)
{
services.AddMvc();
配置(选项=>
{
//options.Filters.Add(新的requireHttpAttribute());
});
services.AddDbContext设置正确,最后我决定:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
命名空间ServiceLayer.Controllers
{
公共类BaseController:控制器
{
私有只读客户端连接字符串;
私有只读帐户上下文帐户上下文;
私有只读配置上下文配置上下文;
公共ClientTemplateContext clientContext;
私有DbContextServices DbContextServices{get;set;}
公共BaseController(AccountsContext accounts、ConfigurationContext配置、ClientConnection连接):base()
{
accountsContext=账户;
configContext=config;
连接字符串=连接;
}
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
//公司的临时选择标识符
Guid cack=Guid.Parse(“827F79C5-821B-4819-ABB8-819CBD76372F”);
var dataSource=(来自configContext.Clients中的c)
其中c.Cack==Cack
在c.CompanyId上的configContext.DataStorage中加入ds等于ds.CompanyId
选择ds.Name).FirstOrDefault();
//原型连接字符串
var cs=connectionString.Client;
如果(!string.IsNullOrEmpty(cs)和&!string.IsNullOrEmpty(dataSource))
{
//填充连接字符串
cs=cs.Replace(“{CLIENT_DB}”,数据源);
clientContext=new ClientTemplateContext()。初始化(cs);
}
base.OnActionExecuting(上下文);
}
}
}
new ClientTemplateContext().Initialise()
有点混乱,但我会在重构其他所有内容时将其清理干净。“ClientTemplateContext”是生成的类,它将它生成的所有实体连接在一起,我已将以下代码添加到该类中(我确实试着把它放在一个单独的文件中,但无法让它工作,所以它暂时留在那里)

publicClientTemplateContext(){}
普里瓦特