如何根据控制器中从其他系统接收到的值使用动态 SQL 连接注入 DbContext

问题描述 投票:0回答:1

使用 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);
    }
}
asp.net-core ef-core-8.0
1个回答
0
投票

根据您的描述和您提供的代码,您是否希望通过控制器接收到数据库连接字符串后创建相应的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);
  }

当我发送正确的数据库连接字符串时,可以观察到获取到了相关信息: enter image description here enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.