Есть ли способ изменить строку подключения службы DbContext в методе Configure после добавления ее в метод ConfigureServices? - PullRequest
0 голосов
/ 13 мая 2019

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

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

в ConfigureServices

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

в Configure

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

Ответы [ 2 ]

0 голосов
/ 13 мая 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)
            {                   
            }
}
0 голосов
/ 13 мая 2019
YourDBContextClass dbcontext = new YourDBContextClass("alternateconnectionstringname");

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

PS Добавьте к своему DbContext коктруктор, чтобы сделать это:

 public partial class YourDBContextClass
 {
    // Add a constructor to allow the connection string name to be changed
 public YourDBContextClass(string connectionStringNameInConfig)
        : base("name=" + connectionStringNameInConfig)
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...