本文介紹了在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編寫為泛型。
這篇關于在ASP.NET核心應用程序內動態更改SQL Server連接字符串的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,