Как создать базу данных в лазурном эластичном пуле с ядром структуры сущностей?

Я хотел бы создать базу данных с ядром Entity Framework, которая будет автоматически добавлена ​​в мой Azure Elactic Pool.

Я делаю это с помощью DatabaseFacadeExtension, которое выполняет команду SQL после создания базы данных, как показано здесь: Azure SQL Server Elastic Pool - автоматически добавляет базу данных в пул

public static async Task<bool> EnsureCreatedAsync(this DatabaseFacade databaseFacade, string elasticPoolName, CancellationToken cancellationToken = default)
        {
            if (!await databaseFacade.EnsureCreatedAsync(cancellationToken)) return false;

            // the database has been created.

            var dbName = databaseFacade.GetDbConnection().Database;

            try
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (!string.IsNullOrEmpty(elasticPoolName))
                {
                    await databaseFacade.ExecuteSqlCommandAsync(new RawSqlString(
                            $"ALTER DATABASE {dbName} MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL (name = [{elasticPoolName}] ));"),
                        cancellationToken);
                }

                return true;

            }
            catch
            {
                await databaseFacade.EnsureDeletedAsync(cancellationToken);
                throw;
            }

        }

Это работает, но я предпочитаю атомарную операцию, в которой база данных будет создаваться непосредственно в пуле эластичности Azure.

2 ответа

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

У меня была общая база данных для управления приложением, и всякий раз, когда появлялся новый клиент, мне нужно было создать новую базу данных. Итак, мне пришлось поддерживать несколько контекстов базы данных в моем основном приложении .NET. Кроме того, у меня были готовые миграции для clientContext в моей кодовой базе, которые просто требовали

      client_db.Database.MigrateAsync();

для создания базы данных. Но я не мог создать его непосредственно в эластичном пуле, поскольку в Azure нет настроек по умолчанию, которые это поддерживают. Итак, MigrateAsync всегда создавал базу данных вне пула.

Итак, я создал базу данных в пуле, используя команду T-SQL из моего общего контекста базы данных, а затем MigrateAsync () для переноса всей необходимой схемы.

      var commandText = "CREATE DATABASE client1 ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = demoPool ) );";
db.Database.ExecuteSqlCommand(commandText);
clientContext client_db = new clientContext(approved_corporate.Id, _configuration);
client_db.Database.MigrateAsync();

Также у меня был собственный конструктор в моем clientContext для поддержки этого:

      public clientContext(int client_id, IConfiguration configuration = null)
{
    string client_code = "client" + client_id.ToString();
    connection_string = configuration["ConnectionStrings:Client"].ToString().Replace("client_code", client_code);
}

Azure Elastic Pool поддерживает создание новой базы данных в существующем пуле или в виде единой базы данных. Вы должны быть подключены к основной базе данных, чтобы создать новую базу данных.

Для получения более подробной информации см.: Transact-SQL: Управление объединенными базами данных.

Пример кода T-SQL:

Создание базы данных в эластичном пуле:

CREATE DATABASE db1 ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = S3M100 ) ) ;

Пожалуйста, смотрите: База данных Azure SQL для одной базы данных / эластичный пул

Вы можете заменить оператор T-SQL и повторить попытку.

Надеюсь это поможет

Другие вопросы по тегам