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

3

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

尝试使用连接字符串类访问连接字符串,还尝试过其他选项,如我不理解的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中的连接字符串。

如何实现这一点的任何提示都将不胜感激。


你是否正在使用Entity Framework或其他ORM?如果是,请指定它。如果不是,你的应用程序中是否有任何处理connectionString或SQL连接的类(可在其他类中使用)?如果有,请提供该类;如果没有,请提供一个样例代码,说明如何连接并为每个用户执行其他查询操作。 - iSR5
1个回答

5
我发现您对于每个数据库都使用一个 DbContext 类。更多信息请参见此处: 文档。 请从 Startup 中移除 AddDbContext,从 DbContext 中移除 OnConfiguring,并将 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编写为通用的。


这对我有用。当作为参数传递给DbContext构造函数时,我使用了optionsBuilder.Options。 - Water

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接