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

Я хотел бы создать базу данных с ядром 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 Elastic Pool.




Ответы (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);
}
person sabhari karthik    schedule 07.05.2021

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

введите здесь описание изображения

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

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

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

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

См.: База данных SQL Azure с одной базой данных / эластичным пулом

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

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

person Leon Yue    schedule 12.04.2019
comment
Да, но я ищу для создания базы данных с Entity Framework (с DbContext), как это. Только не с помощью команды Transact-SQL. - person Kassoul; 12.04.2019
comment
Мне очень жаль, что я не нашел примера создания базы данных с помощью Entity Framework (с DbContext). Но вы можете сослаться на этот учебник Создать код для запроса базы данных SQL с помощью оператора create и достижения вашей цели. Если мой ответ может помочь, не могли бы вы принять его? Спасибо и хорошего дня. - person Leon Yue; 15.04.2019