#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). Значение получается путем доступа к предприятию, привязанному к пользователю.