使用路由切换数据库

时间:2019-02-26 13:20:47

标签: c# asp.net asp.net-mvc entity-framework

这是我的情况:

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

示例:

switch(route)
{
    case(URL/A):
    { 
        USE DATABASE 1 
    }
    case(URL/B):
    { 
        USE DATABASE 2
    }
    DEFAULT:
        USE DATABASE DEFAULT
 }

有可能吗?

3 个答案:

答案 0 :(得分:1)

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

要使用多个数据库连接,每个连接都需要一个连接字符串。

我将使用以下代码段将DbContextOptionsBuilder实例注入Startup.ConfigureServices()

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应用程序中对我有用,我仍在学习该框架,但也许我的回答为您提供了有关多个DbContext的精度。

答案 1 :(得分:0)

您可以创建3个连接字符串以及3个数据访问类。您的类的第一个使用例如DropCreateDatabaseIfModelChanges,其他使用CreateDatabaseIfNotExists。当您调用头等舱时,您的数据库将在需要其他人时创建,而无需重新创建它。

答案 2 :(得分:0)

注册您的上下文(根据请求确定作用域),并使用工厂方法根据当前路由动态创建具有指定连接字符串的上下文(可以从HttpContext或类似途径获得)。如果数据库模式相同,只是数据不同,则应该很容易工作。我无法为您提供摘要,因为它主要取决于您拥有的DI框架。