2

我想创建一个具有实体框架核心的数据库,该数据库将自动添加到我的天蓝色电子池中。

我使用 DatabaseFacadeExtension 在创建数据库后执行 SQL 命令,如下所示: Azure SQL Server Elastic Pool - automatic add database to 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 弹性池中创建数据库的原子操作。

4

2 回答 2

1

我有一个非常相似的问题。幸运的是,我从之前的答案中得到了启发,并在此基础上即兴创作以找到解决方案。

我有一个通用数据库来管理应用程序,每当有新客户加入时,我都需要创建一个新数据库。因此,我必须在我的 .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);
}
于 2021-05-07T08:45:10.693 回答
0

Azure 弹性池支持在现有池中或作为单个数据库创建新数据库。您必须连接到主数据库才能创建新数据库。

在此处输入图像描述

有关详细信息,请参阅:Transact-SQL:管理池化数据库

示例 T-SQL 代码

在弹性池中创建数据库:

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

请参阅:Azure SQL 数据库单库/弹性池

您可以替换 T-SQL 语句并重试。

希望这可以帮助

于 2019-04-12T09:17:05.230 回答