如何在具有实体框架核心的Azure弹性池中创建数据库?

时间:2019-04-12 08:47:05

标签: entity-framework-core azure-sql-database azure-sql-server azure-elasticpool

我想用实体Framework核心创建一个数据库,该数据库将自动添加到我的Azure精细池中。

我使用DatabaseFacadeExtension来做到这一点,该数据库在创建数据库后执行SQL命令,如下所示: Azure SQL Server Elastic Pool - automatically 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弹性池中创建数据库。

2 个答案:

答案 0 :(得分:0)

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

enter image description here

有关更多详细信息,请参见:Transact-SQL:Manage pooled databases

示例T-SQL代码

在弹性池中创建数据库

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

请参阅:Azure SQL Database single database/elastic pool

您可以替换T-SQL语句,然后重试。

希望这会有所帮助

答案 1 :(得分:0)

我有一个非常相似的问题。幸运的是,我从之前的答案中得到了提示,并即兴发挥了它的作用以找到解决方案。

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