由于您使用的是 ASP.NET MVC,因此您的路由取决于您的控制器。然后你可以想象让 ControllerA 使用 DatabaseA 和 ControllerB 使用 DatabaseB。
要使用多个数据库连接,您需要为每个数据库连接一个连接字符串。
我将使用以下代码片段在 Startup.ConfigureServices() 中注入 DbContextOptionsBuilder 的实例
var ContextAOptionsBuilder = new DbContextOptionsBuilder<ContextA>();
var ContextBOptionsBuilder = new DbContextOptionsBuilder<ContextB>();
然后您可以通过这种方式配置您的构建器(取决于您的参数)
ContextAOptionsBuilder.UseSqlServer(Configuration.GetConnectionString("ContextAConnectionString"), builder =>
{
builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
});
ContextAOptionsBuilder.EnableSensitiveDataLogging();
然后您可以通过这种方式将它们作为单例注入:
services.AddSingleton(typeof(DbContextOptionsBuilder<ContextA>),ContextAOptionsBuilder);
您可以使用 BaseController,其构造函数参数可以通过这种方式访问服务:
public BaseController(IConfiguration configuration, IMemoryCache memoryCache,
IHttpContextAccessor contextAccessor,
DbContextOptionsBuilder<ContextA> ContextAOptionsBuilder,
DbContextOptionsBuilder<ContextB> ContextBOptionsBuilder){}
当然,ControllerA 和 ControllerB 是 BaseController 的继承类,您可以非常简单地访问所需的构建器。
public ControllerA(IConfiguration configuration,
IMemoryCache cache,
IHttpContextAccessor contextAccessor,
DbContextOptionsBuilder<ContextA> ContextAOptionsBuilder,
DbContextOptionsBuilder<ContextB> ContextBOptionsBuilder)
:base(configuration, cache, contextAccessor, ContextAOptionsBuilder,ContextBOptionsBuilder)
{
//Create your DbContext using the builder
}
这样您可以使用一个、另一个或两个数据库来构建您的上下文
一种更简单的方法是注入您的配置文件并根据其内容构建您的上下文,但 ppumkin 的评论建议在控制器级别执行此操作是一个坏主意。
此解决方案在 ASP.NET Core MVC 应用程序中为我工作,我仍在学习该框架,但也许我的回答为您提供了有关多个 DbContexts 的精确度。