Есть ли способ изменить строку подключения службы DbContext в методе настройки после добавления ее в метод ConfigureServices?

У меня есть 2 строки подключения в моем appsettings.json, и я использую dbContext.Database.Migrate (); в методе Configure для создания базы данных, если основная строка подключения, которую я использовал для создания службы DbContext в методе ConfigureServices, была неправильной, я сталкиваюсь с исключением, поэтому я хочу изменить строку подключения службы Dbcontext в области исключения. Как я могу этого добиться?

Я попытался выполнить миграцию в ConfigureServices, но не знаю, как создать объект DbContext и как его протестировать.

в ConfigureServices

        services.AddDbContext<RedContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

в Настроить

        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var dbContext = serviceScope.ServiceProvider.GetService<RedContext>();
            var roleManager = serviceScope.ServiceProvider.GetService<RoleManager<IdentityRole>>();
            var userManager = serviceScope.ServiceProvider.GetService<UserManager<ApplicationUser>>();
            // Create the Db if it doesn't exist and applies any pending migration.
            try
            {
                dbContext.Database.Migrate();// throws exception if CS is wrong
                DbSeeder.Seed(dbContext, roleManager, userManager);
            }
            catch (Exception)
            {                   
                // remove old service and create new dbcontext DI service in IserviceCollection with secondary connection string
                //dbContext.Database.Migrate();
                // dbContext.Database.GetDbConnection()
            }

person Habil Harati    schedule 13.05.2019    source источник
comment
Вы проверили это stackoverflow.com/questions/40836102/   -  person SKS    schedule 13.05.2019
comment
Я использую asp.net core 2.2.   -  person Habil Harati    schedule 13.05.2019


Ответы (2)


YourDBContextClass dbcontext = new YourDBContextClass("alternateconnectionstringname");

Попробуй это.

P.S Для этого добавьте в свой DbContext коснруктор:

 public partial class YourDBContextClass
 {
    // Add a constructor to allow the connection string name to be changed
 public YourDBContextClass(string connectionStringNameInConfig)
        : base("name=" + connectionStringNameInConfig)
    {
    }
}
person vsarunov    schedule 13.05.2019
comment
Класс DbContext должен быть производным от DbContext, а конструктор не принимает строки, он принимает только объект DbContextOption. - person Habil Harati; 13.05.2019

Думаю, это сработает.

Создайте новый конструктор для вашего контекста

public partial class RedContext
 {
    // Add a constructor to allow the connection string name to be changed
 public RedContext(string connectionStringNameInConfig)
        : base("name=" + connectionStringNameInConfig)
    {
    }
}

Изменить конфигурацию:

 using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var dbContext = serviceScope.ServiceProvider.GetService<RedContext("alternateconnectionstringname")>();
            var roleManager = serviceScope.ServiceProvider.GetService<RoleManager<IdentityRole>>();
            var userManager = serviceScope.ServiceProvider.GetService<UserManager<ApplicationUser>>();
            // Create the Db if it doesn't exist and applies any pending migration.
            try
            {
                dbContext.Database.Migrate();// throws exception if CS is wrong
                DbSeeder.Seed(dbContext, roleManager, userManager);
            }
            catch (Exception ex)
            {                   
            }
}
person Aldiger Mehilli    schedule 13.05.2019
comment
Это не работает, потому что .GetService () принимает только типы объектов, а не такие объекты, как RedContext (CS). - person Habil Harati; 13.05.2019