gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:20:03 25 4
gpt4 key购买 nike

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

尝试使用连接字符串类访问连接字符串,并尝试了其他选项,例如我不理解的单例。我在运行 SQL Server Express 的本地 Windows 10 系统上运行它。我正在使用 Asp.Net Core 2.1 进行编码

> ASP.Net Core v2.1

构建 Multi-Tenancy 、多年应用程序每个客户每年都会有一个 SQL DATABASE

我希望有一个如下结构的表

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 列将存储要为该 session 打开的数据库名称。

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

我不知道如何更改 startup.cs 中嵌入的连接字符串。

我们将不胜感激有关如何实现这一目标的任何提示。

最佳答案

我发现您正在为每个数据库使用一个 DbContext 类。有关详细信息,请参见此处:docs .从 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 编写为通用的。

关于sql-server - 在 ASP.Net Core 应用程序中动态更改 SQL Server 连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55904017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com