这是我的场景:
我只有一个应用程序,但我需要按路由切换数据库连接。
示例:
switch(route)
{
case(URL/A):
{
USE DATABASE 1
}
case(URL/B):
{
USE DATABASE 2
}
DEFAULT:
USE DATABASE DEFAULT
}有可能吗?
发布于 2019-03-26 22:57:49
由于您使用的是ASP.NET MVC,因此您的路由取决于您的控制器。然后,您可以想象使用DatabaseA的ControllerA和使用DatabaseB的ControllerB。
要使用多个数据库连接,您需要为每个数据库连接指定一个连接字符串。
我将使用以下代码在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核心MVC应用程序中对我很有效,我仍然在学习这个框架,但也许我的回答给了你关于多个DbContexts的精确度。
发布于 2019-02-26 22:50:44
您可以创建3个连接字符串和3个数据访问类。首先,您的类使用例如DropCreateDatabaseIfModelChanges,其他类使用CreateDatabaseIfNotExists。当您调用数据库创建的第一个类时,当您需要其他类时,将不需要重新创建它。
发布于 2019-02-26 23:41:42
注册您的上下文(根据每个请求的作用域),并使用工厂方法根据当前路由使用指定的连接字符串动态创建上下文(应该可以从HttpContext或类似的地方获得)。如果数据库模式是相同的,只是数据不同,这应该很容易工作。我不能为您提供代码片段,因为这主要取决于您拥有的依赖注入框架。
https://stackoverflow.com/questions/54886499
复制相似问题