使用 C#、ASP.NET 8.0 (MVC)、EF Core 8.0(EF Core 新增功能)。
我遇到过这样的情况:AppSettings.Json 中有几个数据库连接。
现在我需要根据从控制器(例如 HomeController)中的第三方系统收到的特定值传递相应的数据库连接字符串。
那么使用依赖注入从控制器传递带有适当连接字符串的 DbContext 的最佳方法是什么。
您可以提供的任何示例代码都会对我有帮助。
提前谢谢您。
创建了一个数据库上下文静态类,使用它我在控制器中创建了一个 DBContext。下面是简化的代码
public static class DbContextFactory
{
public static Dictionary<string, string>? DbConnectionStrings { get; set; }
public static void SetDbConnectionString(Dictionary<string, string>? dbConnectionStrings)
{
DbConnectionStrings = dbConnectionStrings;
}
public static ApplicationContext Create(string dbConnId)
{
DbContextOptionsBuilder<ApplicationContext> optionsBuilder = new();
optionsBuilder.UseSqlServer(DbConnectionStrings![dbConnId]);
return new ApplicationContext(optionsBuilder.Options);
}
}
我的控制器
public IActionResult GetGroupMemebers(string userid)
{
try
{
string databaseId = GetUserDatabaseFromCustomApplication(userid);
appContext ??= DbContextFactory.Create(databaseId.ToLower());
IEnumerable<TeamOwner>? teamOwners = databaseService.GetTeamOwnersAsync(appContext, userid);
//other application logic
}
catch (Exception ex)
{
return View("Index", grpMemVM);
}
}
根据您的描述和您提供的代码,您是否希望通过控制器接收到数据库连接字符串后创建相应的DbContext实例?如果是这样,这里有一个示例方法,您可以用作参考:
在我的
AppSettings.json
中,我有多个数据库连接字符串:
"ConnectionStrings": {
"DropdownContext": "Server=(localdb)\\mssqllocaldb;Database=DropdownContext;Trusted_Connection=True;MultipleActiveResultSets=true",
"WebApplication7ContextConnection": "Server=(localdb)\\mssqllocaldb;Database=CCOO;Trusted_Connection=True;MultipleActiveResultSets=true"
},
我创建了一个自定义的
IDbContextFactory
接口及其实现类:
public interface IDbContextFactory
{
MyDbContext CreateDbContext(string connectionString);
}
public class DbContextFactory : IDbContextFactory
{
public MyDbContext CreateDbContext(string connectionString)
{
var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseSqlServer(connectionString);
return new MyDbContext(optionsBuilder.Options);
}
}
关于Mydbcontext:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public DbSet<Class> Myclass { get; set; }
}
我的控制器:
public IActionResult Ondex(string dbKey)
{
string connectionString = _configuration.GetConnectionString(dbKey);
var context = _dbContextFactory.CreateDbContext(connectionString);
var data = context.Myclass.ToList();
return View(data);
}