在ASP.NET核心应用程序内动态更改SQL Server连接字符串
我在开始时打开一个数据库,然后需要根据用户选择的两个值打开另一个数据库。数据库选择必须在运行时进行,并且每次都会更改。
尝试使用Connection字符串类访问连接字符串,并尝试了其他选项,如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中的连接字符串。
任何有关如何实现此目标的提示都将不胜感激。
解决方案
据我所知,您为每个数据库使用了一个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();
}
}
编辑:当然,您可以将ConextProvider编写为泛型。
相关文章