通过Entity Framework Core连接多个数据库到.NET Core API项目

3

今天我正在学习新的ASP.net Core API 3.1,我想将我的旧网站从MVC4转移到Web API。

除了一个问题外,所有工作都很顺利。问题是数据库连接。在我的旧网站中,我有每个客户的数据库(10/15个数据库),我使用主数据库来获取连接后的客户数据库。

以下是我旧的DBContext代码(这里是本地测试):

public DBContext(string database)
 : base("Data Source=***SQLServer***;Initial Catalog=" + database + ";Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"){}

我从 DAL 中的 AdminDatabase 获取数据库名称字符串,并将其传递给 DBContext。

但现在使用连接服务,我不知道该怎么做。如果将连接字符串放到 appsettings.json 文件中,我无法传递数据库名称参数。

我尝试直接在 startup.cs 文件中指定连接字符串,但我在某个地方看到这样做并不安全,appsetting.json 保持连接字符串的机密性......

如果您有想法,请让我知道朋友们 ;)。


你想在当前的核心项目中连接多个数据库吗? - LouraQ
是的先生,就像我在以前的MVC项目中所做的那样,我希望能够动态地连接到多个数据库。 - Maurice Chocoswiss
你对“动态”的含义是什么?如果你想连接多个数据库,可以创建多个DbContext来连接到appsetting.json中对应的连接字符串,你可以参考:https://learn.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro?view=aspnetcore-3.1#register-the-schoolcontext - LouraQ
是的,我知道这个选项。但是数据库连接取决于用户连接。例如,约翰连接到DB1,因为在他的公司配置文件中,DB是DB1,而对于杰克来说,则是DB2。更清楚了吗?另外,我想能够创建数据库,在admindatabase中设置公司参数的名称,当用户连接时,它使用在admindatabase中设置的数据库,而不需要每次修改appsettings。 - Maurice Chocoswiss
1个回答

2
例如,约翰连接到DB1,因为在他的公司配置文件中,DB是DB1,对于杰克来说是DB2。这样更清晰了吗?而且,我希望能够创建数据库,在admindatabase中设置公司参数的名称,当用户连接时,它使用在admindatabase中设置的数据库,而不需要每次修改appsettings。
首先,您可以将所有连接字符串存储在appsetting.json文件中:
{
  "ConnectionStrings": {
    "DefaultConnection": "...",
    "DB1Connection": " ...",
    "DB2Connection": " ..."
    //...
  } 
}

然后,在DbContext中,注入HttpContext以获取已登录用户的信息,通过判断已登录用户的信息,在DbContextOnConfiguring方法中动态获取对应的连接字符串名称。

   public class ApplicationDbContext : IdentityDbContext<IdentityUser>
        {
            private readonly HttpContext httpContext;
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
                : base(options)
            {
                httpContext = httpContextAccessor.HttpContext;
            }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                IConfigurationRoot configuration = new ConfigurationBuilder()
                    .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                    .AddJsonFile("appsettings.json")
                    .Build();
                var connectionName = "DefaultConnection";// default connection string
                var userName = httpContext.User?.Identity?.Name;
               //If you distinguish according to the company you belong to, 
               //you can also determine to obtain different connection strings by obtaining the company to which the logged-in user belongs
                if(userName == "Jhon")
                {
                    connectionName = "DB1Connection";
                }
               else if (userName == "Jack"){
                    connectionName = "DB2Connection";
                } 
                optionsBuilder.UseSqlServer(configuration.GetConnectionString(connectionName));
          
            } 
        }
    
     

我现在没有时间处理这个问题,稍后我会回来测试你的解决方案;)谢谢你的时间;) - Maurice Chocoswiss
嗨LouraQ,我现在有时间测试你的解决方案,但它并不完全是我想要的。我想获取用户的数据库名称,并仅更改连接字符串中的数据库。例如,John的数据库名称为“abc”,而Jack的数据库名称为“klm”。但是,这个值存储在另一个包含所有用户的数据库中。可以通过AdminDal(及其接口IAdminDal)访问此数据库。该值是通过访问附加到用户的企业来获取的。 - Maurice Chocoswiss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接