Подключение нескольких баз данных к .Проект NET core API через Entity Framework Core

#asp.net-core #asp.net-web-api #entity-framework-core

#asp.net-core #asp.net-web-api #entity-framework-core

Вопрос:

сегодня я изучаю новый 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"){}
  

Я получаю строку имени базы данных из AdminDatabase в DAL и передаю ее в DbContext.

Но теперь с сервисами для подключений я не понимаю, как это сделать. Если я помещаю строку подключения в appsettings json, я не могу передать параметр имени базы данных.

Я пытаюсь указать строку подключения непосредственно в файле startup.cs, но я где-то видел, что это небезопасно, appsetting.json хранит строки подключения в секрете…

Если у вас есть идея, дайте мне знать друзьям 😉

Комментарии:

1. Вы хотите подключиться к нескольким базам данных в вашем текущем основном проекте?

2. да, сэр, как и в моем старом проекте mvc, я хочу иметь возможность динамического подключения к нескольким базам данных

3. Что вы dynamicaly имеете в виду? Если вы хотите подключиться к нескольким базам данных, вы можете создать несколько dbcontext для подключения к соответствующей строке подключения в appsetting.json, вы можете обратиться к:learn.microsoft.com/en-us/aspnet/core/data/ef-mvc /…

4. Да, я знаю этот вариант. Но подключение к базе данных зависит от подключенного пользователя. Например, Джон подключается к DB1, потому что в его профиле компании DB — DB1, а для Джека — DB2. это более понятно? а также я хочу иметь возможность создавать БД, задавать имя в параметре company в базе данных admind, и когда пользователь подключается, он использует набор БД в базе данных admind, и ему не нужно каждый раз изменять настройки приложений

Ответ №1:

Например, Джон подключается к DB1, потому что в его профиле компании DB — DB1, а для Джека — DB2. это более понятно? кроме того, я хочу иметь возможность создавать БД, задавать имя в параметре company в admindatabase, и когда пользователь подключается, он использует DB, установленный в admindatabase, и не нужно каждый раз изменять настройки приложений

Во-первых, вы можете сохранить все строки подключения в файле appsetting.json:

 {
  "ConnectionStrings": {
    "DefaultConnection": "...",
    "DB1Connection": " ...",
    "DB2Connection": " ..."
    //...
  } 
}
  

Затем в dbcontext вводите HttpContext , чтобы получить информацию о вошедшем в систему пользователе, оценивая информацию о вошедшем в систему пользователе, динамически получая соответствующее имя строки подключения в методе OnConfiguring DbContext.

    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));
          
            } 
        }
    
     
  

Комментарии:

1. На данный момент у меня нет времени на это, я вернусь сюда позже, чтобы протестировать ваше решение 😉 спасибо за ваше время 😉

2. Привет, Лурак, теперь у меня есть время протестировать ваше решение, и это не совсем то, чего я не хочу делать. Я хочу получить имя базы данных для пользователя и просто изменить базу данных в строке подключения. Например, John DB — это «abc», а Jack one — «klm». Но это значение хранится в другой базе данных, где находятся все пользователи. Доступ к этим базам данных осуществляется с помощью admind (ее интерфейс IAdminDal). Значение получается путем доступа к предприятию, привязанному к пользователю.