Mit*_*esh 3 sql-server connection-string asp.net-core
我一开始打开一个数据库,然后需要根据用户选择两个值打开另一个数据库。数据库选择必须在运行时进行,并且每次都会改变。
尝试使用连接字符串类访问连接字符串,并尝试了其他选项,例如我不理解的单例。我在运行 SQL Server Express 的本地 Windows 10 系统上运行此程序。使用 Asp.Net Core 2.1 进行编码
> ASP.Net Core v2.1
Run Code Online (Sandbox Code Playgroud)
构建多租户、多年应用程序 每个客户每年都会有一个 SQL 数据库
我希望有一个具有以下结构的表
COMPANY_CODE VARCHAR(3),
COMPANY_YEAR INT,
COMPANY_DBNAME VARCHAR(5)
Run Code Online (Sandbox Code Playgroud)
样本数据
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
Run Code Online (Sandbox Code Playgroud)
因此,每家公司都会有多行 - 每个财政年度一行。
COMPANY_DB 列将存储要为该会话打开的数据库名称。
用户通过身份验证后,我想更改连接字符串以指向所选行的 COMPANY_DB 列中的数据库,然后让登录的用户执行事务。
我无法弄清楚如何更改startup.cs中嵌入的连接字符串。
任何有关如何实现这一目标的提示将不胜感激。
小智 5
我发现您DbContext为每个数据库使用一个类。请参阅此处了解更多信息:文档。从 Startup 中删除 AddDbContext,OnConfiguring从构造函数中删除DbContext并传递options给构造函数。
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,编写提供的服务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);
}
}
Run Code Online (Sandbox Code Playgroud)
在Startup.cs中添加服务:
services.AddScoped<IBlogContextProvider, BlogContextProvider>();
Run Code Online (Sandbox Code Playgroud)
现在您可以使用 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();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:当然,您可以将 ContextProvider 编写为通用的。
| 归档时间: |
|
| 查看次数: |
5368 次 |
| 最近记录: |