DotNet Core устанавливает строку подключения после запуска - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть решение Visual Studio, которое имеет два подключения к базе данных. Первый - это каталог, содержащий имя пользователя, пароль и базу данных. Вторым будут данные пользователей. Я могу установить соединение для базы данных каталога в «ConfigureServices», и это нормально. После того, как пользователь попытался войти в систему и успешно, я могу знать базу данных, к которой пользователь подключится.

Моя проблема в том, как создать службу после запуска. Как использовать строку подключения, чтобы добавить DBcontext в ходе обычной работы. Из моих поисков это нормально, если вы знаете строку подключения при запуске ..

var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));

Но если у меня нет строки подключения при запуске ... Как добавить службу после того, как проект уже запущен и работает, когда у меня наконец есть строка подключения?

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Другой ответ Tolbxela предлагает создать новый контекст при необходимости, где это необходимо, но это не работает, если вы хотите использовать внедрение зависимостей. Вместо этого вы должны предоставить такую ​​фабрику в методе ConfigureServices вашего класса Startup, используя метод расширений AddDbContext, как сказал Камило в комментарии к этому ответу:

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        ...

        services.AddDbContext<BloggingContext>(options =>
        {
            var customerId = serviceProvider.GetService<IHttpContextAccessor>().HttpContext?.User?.FindFirst("customerId")?.Value;
            var connectionString = 
                $"bla blah blah ;Initial Catalog={customerId}";
            options.UseSqlServer(connectionString);

В этом примере начальному каталогу присвоено значение претензии customerId. (FindFirst - это метод расширения, который я написал сам). Этот пример только для того, чтобы дать вам представление о подходе.

Затем вы можете ввести свой контекст, как обычно:

public class MyController : Controller
{

    public MyController(BloggingContext context)
    {
        ...
    }
};
0 голосов
/ 26 апреля 2019

Вы можете создать свой экземпляр DbContext в каждом классе вашего приложения.

Проверьте документы: Настройка DbContext

Пример

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");

using (var context = new BloggingContext(optionsBuilder.Options))
{
  // do stuff
}

Для вашего SQL-соединения

var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlServer(connection);

using (var context = new BloggingContext(optionsBuilder.Options))
{
  // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...