Как создать базу данных в лазурном эластичном пуле с ядром структуры сущностей?
Я хотел бы создать базу данных с ядром 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 и повторить попытку.
Надеюсь это поможет