在ASP.Net Core应用程序内部动态更改SQL Server连接字符串

时间:2019-04-29 13:04:12

标签: sql-server asp.net-core connection-string

我首先打开一个数据库,然后需要根据用户选择两个值来打开另一个数据库。数据库选择必须在运行时进行,并且每次都会更改。

尝试使用Connection String类访问Connection String,并尝试了其他选项,例如Singleton,我不理解。我在运行SQL Server Express的本地Windows 10系统上运行此程序。我使用Asp.Net Core 2.1进行编码

> ASP.Net Core v2.1

构建多租户,多年应用程序 每个客户每年将拥有一个SQL数据库。

我希望有一个具有以下结构的表

COMPANY_CODE VARCHAR(3),
COMPANY_YEAR INT,
COMPANY_DBNAME VARCHAR(5)

样本数据

COMPANY_CODE: AAD
COMPANY_YEAR: 19
COMPANY_DB: AAD19

COMPANY_CODE: AAD
COMPANY_YEAR: 18
COMPANY_DB: AAD18

COMPANY_CODE: AAD
COMPANY_YEAR: 17
COMPANY_DB: AAD17

因此,每个公司都会有多行-每个财政年度一个行。

COMPANY_DB列将存储要为该会话打开的数据库名称。

用户通过身份验证后,我想更改连接字符串以指向所选行的COMPANY_DB列中的数据库,然后让登录的用户执行事务。

我无法弄清楚如何更改startup.cs中嵌入的连接字符串。

任何有关如何实现这一目标的技巧将不胜感激。

1 个答案:

答案 0 :(得分:0)

如我所知,您为每个数据库使用一个DbContext类。这样,请查看docs。 从启动中删除AddDbContext,从OnConfiguring中删除DbContext并将options传递给构造函数。

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}

然后提供DbContext的写服务:

public interface IBlogContextProvider
{
    BlogContext GetBlogContext(string connectionString);
}

public class BlogContextProvider : IBlogContextProvider
{
    BlogContext GetBlogContext(string connectionString)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlServer(connectionString);
        return new BlogContext(optionsBuilder);
    }
}

在您的 Startup.cs 中添加服务:

services.AddScoped<IBlogContextProvider, BlogContextProvider>();

现在您可以使用DI

public class HomeController : Controller
{
    private IBlogContextProvider _provider;

    public HomeController(IBlogContextProvider provider)
    {
        _provider = provider;
    }

    public ActionResult Index()
    {
        using (var context = _provider.GetBlogContext(<your connection string>))
        {
            //your code here
        }
        return View();
    }
}

编辑:当然,您可以将ContextProvider编写为泛型。