Как я могу заставить «update-database» при запуске сайта Asp.Net - PullRequest
0 голосов
/ 24 мая 2018

Справочная информация

Я работаю над существующим сайтом Asp.Net, который использует перенос баз данных и идентификацию Asp.Net.

На сайте есть папка "Миграции", с несколькими миграциями базы данных.Некоторое время назад я создал миграцию «Seed_Only», которая ничего не делает, а просто, как следует из названия, выполняет метод Seed при его вызове следующим образом:

Update-Database -TargetMigration SeedOnly

Независимо от того, является ли это хорошей практикой или нет, метод Seed создает новые роли, если статический вспомогательный класс RolesName содержит какие-либо новые роли:

// Iterate all properties of RolesName and create roles if they don't exist
Type type = typeof(RolesName); 
foreach (var p in type.GetFields())
{
    var v = p.GetValue(null).ToString(); // static classes cannot be instanced, so use null...
    if (!context.Roles.Any(x => x.Name.Equals(v)))
    {
        roleManager.Create(new IdentityRole() { Name = v });
    }
}

Вопрос

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

Цели

Должно произойти следующее:

  1. Создать новые роли, если они еще не существуют
  2. Добавитьновые роли для существующих пользователей - если пользователи являются членами ранее существовавшей роли

Этот связанный ответ предполагает, что я вызову Database.SetInitializer(new ApplicationDbInitializer()); из конструктора ApplicationDbContext.Если я правильно понимаю ответ, это решит мою потребность в «постоянном обновлении ролей», но это не решит мою потребность в добавлении существующих пользователей к новым ролям, как указано в пункте 2.

Как мне идти к достижению моих целей?

1 Ответ

0 голосов
/ 28 мая 2018

Я использовал решение, предложенное здесь .Он состоит из:

1.Статический класс, который создает необходимые данные

public static class LocatorInitializationHandler
{
    public static void Initialize()
    {
        using (var db = new ApplicationDbContext())
        {
            CreateRoles(db);
        }
    }

    private static void CreateRoles(ApplicationDbContext context)
    {
        // iterate role names
        // and insert into db if not already exists
    }
}

2.Вызов статического класса из global.asax.cs

protected void Application_Start()
{
    // Initialize database
    LocatorInitializationHandler.Initialize();
}
...