Динамическое изменение строки подключения к SQL Server внутри основного приложения ASP.Net - PullRequest
1 голос
/ 29 апреля 2019

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

Попытался получить доступ к строке подключения с помощью класса строки подключения и попробовал другие варианты, например Singleton, которые я не понимаю. Я запускаю это в локальной системе Windows 10 под управлением SQL Server Express. Кодирую с помощью Asp.Net Core 2.1

> ASP.Net Core v2.1

Создание многопользовательских, многолетних приложений У каждого клиента будет одна база данных SQL в год

Я надеюсь иметь таблицу со следующей структурой

COMPANY_CODE VARCHAR(3),
COMPANY_YEAR INT,
COMPANY_DBNAME VARCHAR(5)

Пример данных

COMPANY_CODE: AAD
COMPANY_YEAR: 19
COMPANY_DB: AAD19

COMPANY_CODE: AAD
COMPANY_YEAR: 18
COMPANY_DB: AAD18

COMPANY_CODE: AAD
COMPANY_YEAR: 17
COMPANY_DB: AAD17

Итак, каждая компания будет иметь несколько строк - по одной на каждый финансовый год.

В столбце COMPANY_DB будет храниться имя базы данных, которое будет открыто для этого сеанса.

Как только пользователь аутентифицирован, я хочу изменить строку подключения, чтобы она указала на базу данных в столбце COMPANY_DB выбранной строки, а затем позволить вошедшему в систему пользователю выполнять транзакции.

Я не могу понять, как изменить строку подключения, которая встроена в startup.cs.

Любые советы о том, как этого добиться, будут наиболее ценными.

1 Ответ

0 голосов
/ 29 апреля 2019

Как я понял, вы используете один класс DbContext для каждой базы данных. Таким образом, посмотрите документы . Удалите AddDbContext из автозагрузки, удалите OnConfiguring из DbContext и передайте options в конструктор.

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}

Тогда напишите, предоставляя услугу DbContext:

public interface IBlogContextProvider
{
    BlogContext GetBlogContext(string connectionString);
}

public class BlogContextProvider : IBlogContextProvider
{
    BlogContext GetBlogContext(string connectionString)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlServer(connectionString);
        return new BlogContext(optionsBuilder);
    }
}

Добавить службу в Startup.cs :

services.AddScoped<IBlogContextProvider, BlogContextProvider>();

Теперь вы можете использовать DI

public class HomeController : Controller
{
    private IBlogContextProvider _provider;

    public HomeController(IBlogContextProvider provider)
    {
        _provider = provider;
    }

    public ActionResult Index()
    {
        using (var context = _provider.GetBlogContext(<your connection string>))
        {
            //your code here
        }
        return View();
    }
}

РЕДАКТИРОВАТЬ: Конечно, вы можете написать ContextProvider как универсальный.

...