首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用路由交换数据库

使用路由交换数据库
EN

Stack Overflow用户
提问于 2019-02-26 21:20:47
回答 3查看 145关注 0票数 2

这是我的场景:

我只有一个应用程序,但我需要按路由切换数据库连接。

示例:

代码语言:javascript
复制
switch(route)
{
    case(URL/A):
    { 
        USE DATABASE 1 
    }
    case(URL/B):
    { 
        USE DATABASE 2
    }
    DEFAULT:
        USE DATABASE DEFAULT
 }

有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-26 22:57:49

由于您使用的是ASP.NET MVC,因此您的路由取决于您的控制器。然后,您可以想象使用DatabaseA的ControllerA和使用DatabaseB的ControllerB。

要使用多个数据库连接,您需要为每个数据库连接指定一个连接字符串。

我将使用以下代码在Startup.ConfigureServices()中注入DbContextOptionsBuilder的实例。

代码语言:javascript
复制
var ContextAOptionsBuilder = new DbContextOptionsBuilder<ContextA>();
var ContextBOptionsBuilder = new DbContextOptionsBuilder<ContextB>();

然后,您可以这样配置构建器(取决于您的参数)

代码语言:javascript
复制
ContextAOptionsBuilder.UseSqlServer(Configuration.GetConnectionString("ContextAConnectionString"), builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
        });
ContextAOptionsBuilder.EnableSensitiveDataLogging();

然后,您可以通过这种方式将它们作为单例注入:

代码语言:javascript
复制
services.AddSingleton(typeof(DbContextOptionsBuilder<ContextA>),ContextAOptionsBuilder);

您可以使用BaseController,其构造函数参数可以通过以下方式访问服务:

代码语言:javascript
复制
public BaseController(IConfiguration configuration, IMemoryCache memoryCache,
        IHttpContextAccessor contextAccessor,
        DbContextOptionsBuilder<ContextA> ContextAOptionsBuilder,
        DbContextOptionsBuilder<ContextB> ContextBOptionsBuilder){}

当然,ControllerA和ControllerB是BaseController的继承类,您可以非常简单地访问所需的构建器。

代码语言:javascript
复制
  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的精确度。

票数 1
EN

Stack Overflow用户

发布于 2019-02-26 22:50:44

您可以创建3个连接字符串和3个数据访问类。首先,您的类使用例如DropCreateDatabaseIfModelChanges,其他类使用CreateDatabaseIfNotExists。当您调用数据库创建的第一个类时,当您需要其他类时,将不需要重新创建它。

票数 0
EN

Stack Overflow用户

发布于 2019-02-26 23:41:42

注册您的上下文(根据每个请求的作用域),并使用工厂方法根据当前路由使用指定的连接字符串动态创建上下文(应该可以从HttpContext或类似的地方获得)。如果数据库模式是相同的,只是数据不同,这应该很容易工作。我不能为您提供代码片段,因为这主要取决于您拥有的依赖注入框架。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54886499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档